2010-06-08 8 views
4

Je suis scripting Java en utilisant JRuby. En utilisant JRebel, je peux recharger automatiquement les classes Java modifiées dans la JVM JRuby sans redémarrer. Lorsque j'ajoute une nouvelle méthode Java, JRebel recharge automatiquement la classe. Mon problème est que je ne peux pas appeler cette nouvelle méthode directement. Puis-je demander à JRuby d'actualiser son cache de méthode pour la classe Java nouvellement rechargée? Ma seule solution consiste à appeler la nouvelle méthode de manière réfléchie en utilisant java_send.Comment dire à JRuby de recharger/rafraîchir une classe Java?

Exemple:

étape 1. Démarrez la session et irb java_import une classe Java (dire personne).

étape 2. Ajoutez une méthode getName à Person et compilez.

étape 3. Créez une instance de Person (p = Person.new). JRebel montrera qu'il a rechargé la classe Java.

étape 4. Résultats Appel de p.get_name dans un NoMethodError mais p.java_send (« getName ») appelle la méthode getName nouvellement mis en œuvre

Répondre

0

Avez-vous réussi à passer l'option -javaagent afin qu'il soit reconnu par JIRB et commencer l'agent jrebel?

 
jruby -J-noverify -J-javaagent:/path/to/jrebel.jar -S jirb 

J'ai essayé, mais ne voient pas travailler aussi avec java_send

3

J'ai trouvé un moyen d'exécuter JRuby avec JRebel!

L'astuce est de commencer JRuby avec le serveur Nailgun qui utilise le JRebel comme ceci:

jruby --ng-server -J-javaagent:/Applications/ZeroTurnaround/JRebel/jrebel.jar -J-noverify 

des rails Maintenant, l'application peut être démarré avec Nailgun:

jruby --ng -S rails server 

Si rails utilise les classes Java de quelque part et il peut trouver le rebel.xml approprié, le JRebel ramassera les changements et vous n'avez plus besoin de redémarrer les rails.

$CLASSPATH << "#{RAILS_ROOT}/java/target/classes" 

JRuby/JRebel a besoin encore plus de travail que le JRuby ne ramasse pas les modifications aux déclarations de classe, seul le contenu des méthodes connues.