Déployer une application Fluent-http sur Heroku.

Fluent-http est un serveur web Java écrit par David Gageot qui à l’avantage d’être à la fois simple, très léger et riche en fonctionnalité. Facilement testable, le boot du serveur est presque instantané ce qui lui donne, à mon sens, un gros avantage sur les autres serveurs d’application.

Mais, bien qu’étant un serveur Java, fluent-http n’est pas un serveur JEE, il n’utilise pas l’API Servlet. C’est un serveur standalone qui se lance via une classe disposant d’une méthode main. De ce fait, il n’est donc pas reconnu automatiquement par Heroku lors du déploiement comme un conteneur de servlet standard.

Mais rien ce grave car moyennant un brin de configuration, Heroku est capable d’animer presque tout type d’application tant que celle-ci est écrite dans un des langages supportés. Il est donc tout à fait possible de déployer une application basée sur fluent-http sur la plate forme Heroku.

Le Toolbelt Heroku doit préalablement être installé et configuré, ainsi que Git. Maven et un bon IDE sont aussi préférables.

L’application déployée sera un simple “Hello Wold” dont voici le code :

1
2
3
4
5
6
7
public class Application {
  public static void main(String[] args) {
		new WebServer()
			.configure(routes -> routes.get("/", "Hello World"))
			.start();
	}
}

Une fois l’application développée, passons maintenant à la construction de celle-ci pour la rendre déployable sur Heroku. Pour cela, la build Maven utilisera 2 plug-in.

  • maven-dependency-plugin : Qui permet de copier les dépendances du projet.

  • maven-jar-plugin : Qui permet de créer un Jar executable pour notre application.

Mais avant tout, il faut donner un nom à l’artefact qui sera construit par Maven. Cela se fait en renseignant la proprieté finalName dans le POM.xml. Pour rentre notre jar exécutable, il faudra aussi spécifier le nom de la classe portant la méthode main, ici, la class Application ci dessus. Cela donne au final un build qui ressemble à cela :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<build>
  <finalName>fluentheroku</finalName>
  <plugins>
  	<plugin>
  		<artifactId>maven-dependency-plugin</artifactId>
  		<executions>
  			<execution>
  				<id>copy-dependencies</id>
  				<phase>package</phase>
  				<goals>
  					<goal>copy-dependencies</goal>
  				</goals>
  			</execution>
  		</executions>
  	</plugin>
  	<plugin>
  		<artifactId>maven-jar-plugin</artifactId>
  		<configuration>
  			<archive>
  				<manifest>
  					<addClasspath>true</addClasspath>
  					<classpathPrefix>dependency</classpathPrefix>
  					<mainClass>fr.dalichampt.fluentheroku.Application</mainClass>
  				</manifest>
  			</archive>
  		</configuration>
  	</plugin>
  </plugins>
</build>

La construction via mvn package produit maintenant un Jar capable d’être executé via la commande :

java -jar target/fluentheroku.jar

Pour exécuter fluent-http en mode production, on pourra ajouter l’argument -DPROD_MODE=true lors du lancement.

Pour déterminer quelle commande permet de lancer une application, Heroku se base sur un fichier Procfile qui doit être placé à la racine du projet. Ce fichier doit contenir sur une même ligne, la type de processus à lancer et la ligne de commande pour le faire. Comme nous déployons une application web, le fichier Procfile ressemblera à :

web: java -DPROD_MODE=true -jar target/fluentheroku.jar

Il ne reste plus qu’a commiter tout cela sous Git et à créer l’application Heroku en 3 petites commandes :

heroku create
git push heroku master
heroku ps:scale web=1

Voilà l’application déployée et disponible à l’adresse https://fluent-heroku.herokuapp.com/.

Les sources complètes sont quant à elles disponibles sur Github.