2

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" を追加しようとしましたが、最初のクラスのリソース コネクタに送信されますが、その依存関係には送信されません。

4

1 に答える 1