2013-04-30 5 views
3

J'essaie de déboguer un script Groovy dans Eclipse à partir d'un test JUnit. Le code Groovy fait partie d'une application Java plus grande qui s'exécute dans Tomcat. Pour diverses raisons, notre système est configuré pour utiliser des expressions JSR223 compilées. Voici l'extrait de code abrégé:Débogage d'un script Groovy compilé dans Eclipse

GroovyScriptEngineImpl engine = new GroovyScriptEngineImpl(); 
Resource r = 
    new ClassPathResource("groovy/transformations/input/Foo.groovy"); 
String expression = IOUtils.toString(r.getInputStream()); 
CompiledScript script = engine.compile(expression); 
String result = (String) script.eval(new SimpleBindings(bindings)); 

Le test fonctionne bien, mais même si j'ai un point d'arrêt défini dans Foo.groovy, et le fichier est sur le chemin de classe, le point d'arrêt ne se fait frapper lors du débogage. Je suppose que cela ne fonctionne pas car il n'y a aucune association entre l'expression au format String et le fichier réel qui le contient. Donc existe-t-il un moyen de créer cette association entre la chaîne et son nom de fichier correspondant? Comme mentionné, j'ai besoin d'utiliser un CompiledScript. Comme une note de côté, je suis en mesure de frapper le point d'arrêt dans le débogueur avec le même script Groovy lors de l'utilisation de cette approche:

Resource r = 
    new ClassPathResource("groovy/transformations/input/Foo.groovy"); 
GroovyShell shell = new GroovyShell(new Binding(bindings)); 
String str = (String) shell.evaluate(r.getFile()); 

Mais bien sûr, dans ce cas, le moteur Groovy charge le fichier directement. Tous les conseils sur la façon de faire fonctionner le premier exemple sont grandement appréciés. Merci.

+0

J'ai oublié de mentionner que j'ai activé l'option "Activer le support du dossier de script" dans les paramètres du compilateur Groovy dans Eclipse. – user2337270

Répondre

4

Vous avez tout à fait raison de dire que cela a à voir avec la création d'une classe à partir d'une chaîne. GroovyScriptEngineImpl aime attribuer des noms arbitraires au script compilé, car il suppose que tout provient d'une chaîne. Le GroovyShell, cependant, génère le nom du script basé sur le fichier d'où provient le script, et c'est le lien dont le débogueur a besoin.

Je vous recommande peut-être d'éviter d'utiliser GroovyScriptEngineImpl et d'utiliser GroovyShell.parse à la place. Et puis, vous pouvez créer un GroovyCompiledScript à partir du résultat de GroovyShell.parse et en utilisant un nouveau GroovyScriptEngineImpl. Quelque chose comme ceci:

File f = getScriptFile(); 
Script s = new GroovyShell().parse(f); 
CompiledScript cs = new GroovyCompiledScript(new GroovyScriptEngineImpl(), s.getClass()); 
... 

Notez que je ne l'ai pas encore essayé, mais d'après mon expérience, cela devrait fonctionner. Si vous vous sentez vraiment bon, j'élèverais un jira sur le tracker de problème groovy pour vous assurer que vous pouvez passer un nom propre pour les scripts créés en utilisant le GroovyScriptEngineImpl.

+0

Andrew, merci beaucoup! Cela a fonctionné comme un charme. Je pense que je peux obtenir ce travail en utilisant votre recette! Très appréciée. Si vous me montrez un lien vers le tracker de problème de Groovy Jira, je vais certainement déposer un RFE selon votre recommandation. Merci encore, et j'espère que cela a été utile pour d'autres. – user2337270

+0

Suivi des problèmes est ici: http://jira.codehaus.org/browse/GROOVY Typiquement, si une réponse fonctionne pour vous, vous acceptez la réponse en cliquant sur le chèque. –

+0

Andrew, est-il possible de créer un problème sans créer de compte et se connecter? Merci. – user2337270