0

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

4

1 に答える 1

1

スクリプトの実行方法によって異なりますか?いくつかの方法、

  1. java -cp lib/yourLib.jar;lib/groovy.jar org.codehaus.groovy.tools.GroovyStarter --classpath lib/yourBindingLib.jar;lib/.jar --main groovy.ui.GroovyMain YourScript.groovy

  2. ライブラリをコードで使用する前に、ライブラリの URL を指定することもできます。

    def bindingLib = new File("...");
    loader.addURL(bindingLib.toURI().toURL())

于 2012-10-19T00:54:19.923 に答える