ライブラリを開発しましたが、そのメソッドの 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 経由でライブラリを使用することを期待しています)。