OSGi 内で Groovy を使用して、さまざまなバンドルからスクリプトをロードすることを計画していましたが、いくつかの Groovy ファイルと単純な jUnit テストで簡単に始められると思っていました..それは良い考えでした。私はすぐに、さまざまなパッケージの Groovy クラスで問題に遭遇しました。
カスタム ResourceConnector を使用して GroovyScriptEngine を作成しました。要求されたファイルを出力し、クラスパス (リソース ディレクトリ) からロードしようとするだけです。エラー処理を削除した場合:
public URLConnection getResourceConnection(String arg0) throws ResourceException {
System.err.println("Wanted: " + arg0);
return getClass().getResource("/" + arg0).openConnection();
}
したがって、私のリソース (後で OSGi バンドルまたはファイルシステムからロードするためのリソース) dir には、次のディレクトリ構造があります。
com\test\groovy\SubPackageWithNoImport.groovy
com\test\groovy\SubPackageWithImport.groovy
com\test\groovy\SubPackageWithStaticImport.groovy
com\test\groovy\sub\IsolatedSub.groovy
SubPackageWith* ファイルは、「IsolatedSub」クラスのメソッドを呼び出そうとします。
IsolatedSub.groovy:
package com.test.groovy.sub;
public class IsolatedSub
{
public int dummy() {
return 1337;
}
public static int dummy2() {
return 1338;
}
}
SubPackageWithNoImport.groovy:
package com.test.groovy;
public class SubPackageNoImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
SubPackageWithImport.groovy:
package com.test.groovy;
import com.test.groovy.sub.IsolatedSub;
public class SubPackageWithImport {
public int dummy() {
IsolatedSub s = new IsolatedSub();
return s.dummy();
}
}
SubPackageWithStaticImport.groovy:
package com.test.groovy;
import static com.test.groovy.sub.IsolatedSub.dummy2;
public class SubPackageWithImportStatic {
public int dummy() {
return dummy2();
}
}
私が実行するために使用するコードはこれです(jUnitテストで):
// "this" implements ResourceConnector as shown above
GroovyScriptEngine engine = new GroovyScriptEngine(this, getClass().getClassLoader());
Class<?> cl = engine.loadScriptByName("com/test/groovy/SubPackageNoImport.groovy");
GroovyObject o = (GroovyObject)cl.newInstance();
Object rv = o.invokeMethod("dummy", null);
依存関係のない個々のクラスを問題なくロードでき、同じディレクトリに依存関係を持つこともできますが、サブパッケージまたはスーパーパッケージに移動するとすぐに、問題が発生します。
SubPackageWithNoImport (インポートせずに IsolatedSub を使用しようとする) の場合、ResourceConnector から次のものをロードしようとします。
Wanted: com/test/groovy/SubPackageNoImport.groovy
Wanted: com/test/groovy/IsolatedSub.groovy
ええ、理にかなっています...パッケージを指定しなかったので、同じはずです
今、それは奇妙になり始めます、SubPackageWithImport:
Wanted: com/test/groovy/SubPackageWithImport.groovy
Wanted: java/lang/com$test$groovy$sub$IsolatedSub.groovy
これは私には見えます.. java.langの「com」への内部クラス???
SubPackageWithStaticImport の場合:
Wanted: com/test/groovy/SubPackageWithImportStatic.groovy
Wanted: com/test/groovy/com/test/groovy/sub/IsolatedSub.groovy
近いですが、それでも間違っています。
だから、それが背景でした...私の質問は次のとおりです。私は何を間違っていますか? GroovyScriptEngine は、異なるパッケージ名を持つ groovy クラスでどのように動作するはずですか?
追加の質問: カスタム プロトコル、つまり "test://filegoeshere" を追加しようとしましたが、最初のクラスのリソース コネクタに送信されますが、その依存関係には送信されません。