繁体   English   中英

在Eclipse中调试已编译的Groovy脚本

[英]Debugging a compiled Groovy script in Eclipse

我正在尝试从JUnit测试中调试Eclipse中的Groovy脚本。 Groovy代码是在Tomcat中运行的更大的Java应用程序的一部分。 由于各种原因,我们的系统设置为使用已编译的JSR223表达式。 这是缩写的代码片段:

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));

测试运行正常,但即使我在Foo.groovy中设置了断点,并且文件在类路径上,断点也不会在调试时被击中。 我猜这不起作用,因为String格式的表达式与包含它的实际文件之间没有关联。 那么有没有办法在String和相应的文件名之间创建这种关联? 如上所述,我需要使用CompiledScript。 作为旁注,在使用此方法时,我能够使用相同的Groovy脚本在调试器中命中断点:

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

但是,当然,在这种情况下,Groovy引擎直接加载文件。 任何关于如何让第一个例子工作的提示都非常感激。 谢谢。

你完全正确,这与从字符串创建一个类有关。 GroovyScriptEngineImpl喜欢为编译的脚本分配任意名称,因为它假定所有内容都来自字符串。 但是,GroovyShell根据脚本来自的文件生成脚本名称,这是调试器所需的链接。

我建议您避免使用GroovyScriptEngineImpl并使用GroovyShell.parse。 然后,您可以从GroovyShell.parse的结果创建GroovyCompiledScript并使用新的GroovyScriptEngineImpl。 像这样的东西:

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

请注意,我还没有尝试过,但根据我的经验,这应该可行。

如果您感觉非常精神充沛,我会在groovy问题跟踪器上提出一个jira,以确保您可以为使用GroovyScriptEngineImpl创建的脚本传递正确的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM