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

标签 eclipse debugging groovy scripting jsr223

我正在尝试通过 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 中设置了断点,并且文件位于类路径上,调试时也永远不会命中断点。我猜这不起作用,因为字符串格式的表达式与包含它的实际文件之间没有关联。那么有没有办法在字符串与其对应的文件名之间创建这种关联呢?如前所述,我需要使用 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 的结果并使用新的 GroovyScriptEngineImpl 创建 GroovyCompiledScript。像这样的事情:

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

请注意,我尚未尝试过此操作,但根据我的经验,这应该可行。

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

关于eclipse - 在 Eclipse 中调试已编译的 Groovy 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16307912/

相关文章:

java - 使用 Maven 运行常规测试

android - 如果 Android Gradle Build 中不存在默认属性文件,我该如何创建它

java - 为什么我不能安装 Eclipse?

c++ - 简单代码导致错误读取变量: Cannot access memory at address

javascript - 从 JS 调用 IE Js 调试器

debugging - Tensorboard Visual Debugger UnimplementedError 对象不可迭代

java - 包含作为参数传递的对象的函数的设计困难

eclipse - Java EE Eclipse Servlet Tomcat 7 错误 : The servlets named [. ..] 都映射到不允许的 url-pattern [...]

eclipse - 可以拦截eclipse中的“打开文件”菜单吗?

groovy - 将元组列表映射到 Groovy 中的第二个元素列表?