The idea is to have a template with some common configurations such as necessary files for Heroku deployment, JPA (with Hibernate), JSF, Primefacs, Postgres, Maven dependencies / plugins among other things
- Java 8
 - Maven 3
 - JSF 2.2.7 for presentation
 - Primefaces 6.1 for presentation
 - JPA 2.1
 - Hibernate 5.2.10
 - Netbeans 8.2
 - Force.com Partner API for Salesforce communication
 - GSON 2.8.0 for serializing / parsing json
 - Postgres SQL for persistence
 - Apache httpcode 4.4 for doing http requests
 
As I explain here Sometimes you want to change the behaviour of your code without recompiling / deploying. A way to do this is defining environment variables that you can change at any time.
Create a file called $TOMCAT_HOME/bin/setenv.sh
Define the variable like this:
export VAR1=my_var1_value
export VAR2=my_var2_value
Give execution permission:
chmod 755 setenv.sh
Define variables like this:
set VAR1=my_var_value
In the root you project create a file called Procfile with the content
web:    java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
Optionally you can create a file called system.properties to specify the version of Java to use in Heroku, the content could be:
java.runtime.version=1.8
Add the following plugin:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <!-- required for heroku deployment -->
                                <artifactItem>
                                    <groupId>com.github.jsimone</groupId>
                                    <artifactId>webapp-runner</artifactId>
                                    <version>8.0.30.2</version>
                                    <destFileName>webapp-runner.jar</destFileName>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>This plugin is for... well, you know
            <!-- to run this plugin: mvn findbugs:gui -Dfindbugs.skip=false -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <version>3.0.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                            <goal>findbugs</goal>
                            <goal>gui</goal>
                        </goals>
                        <id>check</id>
                    </execution>
                </executions>
                <configuration>
                    <foo>bar</foo>
                </configuration>
            </plugin>The class com.example.java.web.heroku.template.util.MyWorker contains just a main method to be called by a Heroku worker dyno through the Profile using this sentence:
worker: java -cp  target/classes:target/dependency/*:target/java-web-heroku-template-1.0-SNAPSHOT/WEB-INF/lib/* com.example.java.web.heroku.template.util.MyWorker ""
After deploying the web app, scale a worker
$ heroku ps:scale worker=1
Open the logs to see it working
$ heroku logs --tail