ライブラリを開発しましたが、そのメソッドの 1 つが次の形式になっています。
void setVars(def script) {
// script parameter is an instance of groovy.lang.Script loaded by Rootoader
// MyBinding is part of the lib and extends groovy.lang.Binding
script.setBinding(new MyBinding())
}
ここで、ライブラリが jar ファイルとして使用されると、未定義のメソッド例外が発生します。これは、スクリプト オブジェクトがメイン アプリケーションから渡され、RootLoader によってロードされ、MyBindingsun.misc.Launcher$AppClassLoader
がその子である によってロードされるためです。RootClass Loader を使用して jar 全体をロードする方法はありますか? 何らかの理由で、rootLoader.loadClass("MyBinding")
AppClassLoader によってロードされたクラスを返し、再ロードしません。
例を使用して更新します。
S.script (ユーザーが作成):
println 1
Main.groovy (ユーザー作成):
class Main {
static void main(String[] args) {
Lib.setVars(S)
}
}
ユーザーがクラスパスに追加した私の lib.jar:
class MyBinding extends Binding {
//...
}
class Lib {
static void setVars(Class scriptClass) {
def script = scriptClass.newInstance()
//Exception as MyBinding is loaded by MyBinding
//while script class is loaded by RootLoaded
script.setBinding(new MyBinding())
}
}
Main.groovy は実行されるファイルです。lib.jar が Java Build Path -> Libraries セクションのプロジェクトのクラスパスに追加される Eclipse から実行します (ユーザーはこの方法または Maven 経由でライブラリを使用することを期待しています)。