3

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 形式の式とそれを含む実際のファイルとの間に関連付けがないため、これは機能しないと思います。では、文字列とそれに対応するファイル名の間にこの関連付けを作成する方法はありますか? 前述のとおり、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 エンジンはファイルを直接ロードします。最初の例を機能させる方法に関するヒントは大歓迎です。ありがとう。

4

1 に答える 1

4

これが文字列からクラスを作成することに関係していることは間違いありません。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());
...

私はまだこれを試していませんが、私の経験に基づいて、これはうまくいくはずです。

あなたが本当に元気なら、GroovyScriptEngineImpl を使用して作成されたスクリプトに適切な名前を渡せるように、Groovy Issue Tracker で Jira を作成します。

于 2013-05-01T20:19:19.653 に答える