1. Partiremos de un proyecto Maven. Puedes ver cómo crearlo en este enlace.
2. Para poder ejecutar aplicaciones de Java en Heroku, habrá que vincularles el plugin webapp runner (https://devcenter.heroku.com/articles/java-webapp-runner).
Tienes el código que usaremos justo debajo.
pom.xml
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>copy</goal></goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.github.jsimone</groupId>
<artifactId>webapp-runner</artifactId>
<version>8.5.31.0</version>
<destFileName>webapp-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
La versión del webapp runner está vinculada a la versión de Apache Tomcat; es decir, la versión 8.5.23.0 de webapp runner usa la versión 8.5.23.0 de Apache Tomcat.
3. Debemos asignar dynos a nuestro proyecto, para ello creamos un fichero Procfile en la raíz de nuestro proyecto con el siguiente código:
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war