août
2008
On a tous plus ou moins entendu parler de JavaRebel, la solution magique qui permet d’apporter la touche PHP à Java en offrant le rechargement instantanée des classes Java modifiées sans avoir à redémarrer le conteneur.
Dans ce billet, je vais montrer comment utiliser JavaRebel avec WTP sur Eclipse (c’est pas si évident que ça).
Le problème vient surtout du fait qu’Eclipse WTP offre une fonction plus ou moins similaire (moins magique en tout cas) qui consiste à recharger le contexte en cas de changement dans l’un des fichiers de l’application en cours d’exécution.
Pour commencer, téléchargez si ce n’est pas déjà fait JavaRebel.
Il faut noter que JavaRebel est un produit commercial. Il faut donc acquérir une license pour pouvoir l’utiliser ou encore télécharger une version d’évaluation ce qui offre 21 jours d’essais.
J’ai testé avec la dernière version de développement : la version 1.2-M1 est téléchargeable ici (à vos propres risques).
Décompressez ensuite l’archive de JavaRebel quelque part dans votre disque (« /home/djo/java/tools/javarebel-1.2-M1″ dans mon cas).
Dans Eclipse, et en supposant que vous avez un projet web nommé « test » par exemple, procédez comme suit:
- Lancez le projet comme d’habitude (je déploie sur Tomcat par exemple). Le but est de créer une configuration de lancement.
- Arretez le serveur
- Ouvrez la fenêtre « Run Configurations » : cliquez sur le flêche à droit du bouton « Run » pour trouver l’entrée concernée.
- Localisez et sélectionnez l’entrée correspondante à votre configuration de lancement (« Tomcat v6.0 Server at localhost » par exemple dans mon cas) et Activez l’obglet « Arguments »:
- Dans la zone de texte « VM Arguments », ajoutez:
-noverify -javaagent:/home/djo/java/tools/javarebel-1.2-M1/javarebel.jar
Il faut bien sûr adapter le chemin vers JavaRebel.
Validez. -
Jusque la, JavaRebel fonctionne bel et bien. Essayez de lancer le projet et de modifier ensuite une classe quelconque.
Vous devriez voir dans la console d’Eclipse:JavaRebel: Reloading class '**.******.****.web.TestPage'.
Seul hic, WTP recharge lui aussi le contexte, annulant ainsi l’atout de JavaREbel:
INFO: Reloading this Context has started
JavaRebel: Reloading class '**.******.****.web.TestPage'.
Jun 19, 2008 7:02:49 PM org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
Jun 19, 2008 7:02:50 PM org.apache.catalina.core.StandardContext addApplicationListener - Pour régler celà, localisez votre serveur dans la vue « Servers »:
Double-cliquez sur votre serveur, ce qui devrait afficher l’éditeur suivant (après avoir sélectionné la page « Modules » en bas):
Sélectionnez votre module, et cliquez sur le bouton « Edit » (à droite).
DAns la boite de dialogue qui s’affiche, décochez l’option « Auto Reloading Enabled »:Validez et enregistrez.
- Mainteant, démarrez votre projet et essayez de faire quelques modifications sur vos classes : un simple F5 sur les pages de l’application et les modifications sont incorporés instantanément.
Seul hic: les modifications sur les ressources autres que Java (html, css, etc.) ne sont plus prises en comptes, à moins de redémarrer manuellement le serveur (Je continue mes recherches de ce côté là, si vous avez des idées, je suis preneur !)
En fait, c’etait plutôt un bug de WTP je crois … après quelques essais, rechargement à chaud des ressources marche sans problème et ce indépendamment de JavaRebel.
[…] small »; var topsy_order = « count,retweet,badge »; var topsy_url = « http://blog.developpez.com/djo-mos/p5937/eclipse/utilisation-de-javarebel-avec-eclipse/ »; Add Topsy Retweet Butt […]
@metalpetsFR> Yep, j’avais oublié en fait de mettre à jour le billet en conséquence, mais je ne sais pour quelle raison, le publishing des ressources n’a pas marché la(les) première(s) fois, puis le problème s’était réglé tout seul … je veux même pas comprendre pourquoi
Merci beaucoup pour le tip.
toomasr> Hi Toomas. I’m very glad you found my article interesting
About the resource refreshing, I can positively state that it DOES work with the configuration described in this blog.
Thing is, I’ve had a strange (kid of X-Files stuff if you know what I mean) problem with resources refreshing with WTP the first couple of times I’ve tested (hence my last statement in the article). But later, things went better and WTP now automatically publish non-class resources … Can’t figure out what went wrong the first time though … actually, I’m not even interested in knowing why now that it works
My bad that I did not update my article to indicate this. This will be done right now.
Cheers et Kudos for this great product.
Hi, I’m Toomas from the ZeroTurnaround team. Excellent article. We have read it via Google translator. We will release something similar next week in English.
Our tests with Eclipse 3.4 and WTP 3.0 (comes with Eclipse 3.4) show that when following the instructions outlined in this article (_enable_ autopublishing, _disable_ auto reload):
*) JavaRebel will pick up the changes to Java classes
*) WTP will copy project resources under WebContent (html, css, jsp etc.) to the deployment folder
So everything seems to work and you can get zero turnaround with WTP & JavaRebel.
Salut
Merci pour la présentation de JavaRebel.
Mais concernant WTP et ton problème de mis a jour des fichier de ressources, voila ce que j’ai chez moi :
Travaillant sur une application assez lourde le redemerrage systématique de tomcat lors de la modification d’une classe est plutot lourde, nous avons donc modifié la config d’eclipse pour que le tomcat ne « re-load » pas son contexte, c’est bien l’option que tu suggere de décocher : « Auto reload enabled ». Et avec cette config les modifications basiques de classes (sans modifier leurs structures) sont prises à chaud. Concernant les modifications de classes importante, là il faut redémarrer le serveur, et c’est donc là que javaRebel serait utile (pas contre j’ai eu des probleme avec Hibernate…)
Concernant les modifications de fichiers de ressources, chez moi ils sont bien mis a jour, l’option (activée par défaut) qui est responsable de ça, est dans la config du serveur : « Automatic Publishing Override default settings 1s. »
J’espere que ça pourra t’aider.
Par contre j’ai une question, Qu’elles sont les limites de javaRebel et surtout peux t on espéré qu’une autre solution du même type, mais en licence LGPL voit le jour, pourquoi fournit dans le JDK ?
A+
Super article merci je vais essayer ça!