Alfresco propose deux solutions : JRebel (payante) et HotswapAgent (open source). Pour l’instant j’ai choisi de ne pas investir dans JRebel et de bien tester son concurrent gratuit pour voir s’il suffit. Alfresco nous donne un tutoriel officiel pour l’utiliser, mais il manque quelque passage (notamment l’utilisation dans Eclipse qu’on ne trouve que pour JRebel), donc je vais refaire le tour pour arriver a un petit projet basé sur l’archétype Maven et le code démo qu’il contient.
La liste de courses
Nous allons utiliser un correctif pour la machine virtuelle Java (ne paniquez pas, il s’installe à côté, sans modifier la VM originale). Téléchargez donc la version pour Java 8 de DCEVM (version 8u152 à l’heure).
Bien évidemment, il faut avoir exactement la même version de Java, donc si vous utilisez une version différente, allez fouiller dans l’archive Oracle pour trouver la bonne.
Enfin, le vrai HotswapAgent. Inutile de télécharger la version la plus récente : pour Alfresco il faut utiliser la 1.0.
Voici un résumé des fichiers que j’ai utilisés dans Linux :
L’installation
Après avoir installé le JDK (pas besoin de l’installer en tant que administrateur), appliquez le correctif en utilisant cette commande :
$ java -jar DCEVM-8u152-installer.jar
En Windows on peut aussi taper deux fois sur DCEVM-8u152-installer.
Il s’agit d’un installateur qui vous donne une interface utilisateur assez simple :
Ajoutez la VM que vous venez d’installer et après tapez sur Install DCEVM as altjvm
:
Quant au JAR du HotswapAgent, il faut tout simplement le mettre quelque part et se souvenir de son parcours.
Creation d’un projet
Créez un projet Maven comme indiqué dans la documentation Alfresco :
mvn archetype:generate -Dfilter=org.alfresco:
Choisissez l’archétype « All-in-One » et configurez les paramètres comme vous voulez.
Configuration d’Eclipse
Après avoir rajouté le JDK installé à la liste des JREs disponibles dans Eclipse (Window > Preferences > Java > Installed JREs), importez le projet (la documentation officielle explique comment faire et vous l’avez déjà fait plusieurs fois, donc je vous évite les détails).
Exécution du projet en mode hot reloading
Enfin, vous êtes prêts à créer une configuration pour exécuter le code. Dans les configurations de debug, créez-en une nouvelle de type Maven. Les paramètres à définir sont :
- Base directory
${project_loc}
- Goals
clean install alfresco:run
- Dans l’onglet JRE, sélectionnez le JRE avec le correctif DCEVM
- VM arguments
-Xms256m -Xmx2G -javaagent:/<parcours du HotswapAgent>/hotswap-agent-1.0.jar -XXaltjvm=dcevm
(Je vous conseille aussi de sélectionner Skip Tests, parce que la VM Hotswap est plus lente, donc c’est mieux de vérifier les tests séparément.)
Cette configuration peut être exécuté en mode DEBUG. Il faudra attendre un peu plus que d’habitude avant de pouvoir se connecter à Alfresco, mais il vaut le coup.
Cela donne quoi ?
Nous allons faire le test proposé par Alfresco dans le tutoriel JRebel : en se connectant à http://localhost:8080/alfresco/s/sample/helloworld, ou ici ; le résultat sera Message: ‘Hello from JS!’ ‘HelloFromJava’
Sans arrêter le processus de debug, nous allons modifier ce message qui est généré par trois fichiers du projet platform-jar (on peut les ouvrir en tapant Ctrl+R et helloworld) : helloworld.get.js, helloworld.get.html.ftl et HelloWorldWebScript.java. Habituellement, un changement à chacun de ces fichiers entraine un redémarrage du projet.
Allons donc changer les messages :
- dans helloworld.get.js remplacez
model["fromJS"] = "Hello from JS!";
avecmodel["fromJS"] = "Bonjour de JS !";
- dans helloworld.get.html.ftl remplacez
Message: '${fromJS}' '${fromJava}'
avecMessages : '${fromJS}' et '${fromJava}'
- dans HelloWorldWebScript.java remplacez
model.put("fromJava", "HelloFromJava");
avecmodel.put("fromJava", "Bonjour de Java");
À noter que chaque fois que vous tapez Ctrl+S, les changements sont pris en charge à l’instant et le log vous en donne confirmation. Un coup de F5 dans Firefox vous donne le nouveau message qui arrive des trois fichiers modifiés : pour l’instant rien à envier à JRebel.
Conclusion
Je trouve encore plus intéressante de pouvoir exécuter mes tests d’intégration en mode debug hot reloading, ce qui donne la possibilité de redémarrer à la volée une méthode qu’on vient de changer. Cela sera peut-être le sujet d’une autre article si cela vous intéresse.