在Eclipse中调试ScriptEngine运行的Groovy脚本

8

我有一个Groovy脚本,它是这样运行的:

File scriptFile = ...;
ScriptEngine engine = ...;
String script = FileUtils.readFileToString(scriptFile);
Object evalResult = engine.eval(script, bindings);

不出所料,脚本文件中设置的断点没有触发。我应该做哪些改变才能使其正常工作?这个脚本需要在较大程序的上下文中运行(没有单独的启动配置),并通过 ScriptEngine 运行,该文件在运行时才会被知晓。

2个回答

4

我正在使用这个技巧:我定义了一个名为Debugger的Java类,它看起来像这样:

public class Debugger {

    private static final Logger log = LoggerFactory.getLogger( Debugger.class );

    /**
     * Invoke this method anywhere to end up in the Java debugger.
     * 
     * <p>Sometimes, you have code that might eventually be executed or you have a place
     * where you want to stop but no code line.
     * 
     * <p>In these case, use this method.
     * 
     * <p>Don't forget to set a breakpoint, first :-)
     * */
    public static void stopInDebugger() {
        log.error( "Please set a breakpoint in Debugger.stopInDebugger() and try again whatever you just did!" );
    }
}

我在Eclipse的log.error行设置了断点。

现在,我可以将这行代码放入脚本中想要设置断点的位置:

Debugger.stopInDebugger();

虽然它不能让我轻松地逐步执行脚本,但总比没有好。


调试器将在Debugger类中的log.error(...)处暂停。它仅显示Debugger类的变量。 如何获取脚本中要评估的变量,或查看与脚本相关的变量等? - AhmedRana
1
@AhmedRana Groovy会从你的脚本创建Java类对象。只需向上堆栈即可。变量将是脚本类堆栈帧中的局部变量或该类的字段。 - Aaron Digulla
非常感谢 :) 使用过Groovy 您知道这是否也可以与Jython一起使用吗? - AhmedRana
从未使用过jython,不过可以查看http://www.jython.org/docs/library/debug.html。 - Aaron Digulla

1

你的脚本文件是否在类路径上的源文件夹中(听起来好像不是)?如果不是,请将其放入其中。您还可以更改首选项,以确保编译器永远不会编译脚本文件(甚至可以选择不将其复制到输出文件夹)。转到“首选项” ->“Groovy” ->“编译器”,查看脚本文件夹以实现此目的。


在我的情况下,脚本中缺少了包行。我更喜欢你在这个问题的帖子:https://dev59.com/C1PTa4cB1Zd3GeqPmtTd - Vince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接