gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:26:22 25 4
gpt4 key购买 nike

我正在尝试通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com