gpt4 book ai didi

java - 使用 root loader 加载 jar

转载 作者:行者123 更新时间:2023-12-01 15:05:53 25 4
gpt4 key购买 nike

我开发了一个库,其方法之一具有以下形式:

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 加载,而 MyBinding 由 sun.misc.Launcher$AppClassLoader 加载。 ,这是它的 child 。有没有办法使用 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 是运行的文件。我在 Eclipse 中执行此操作,其中 lib.jar 添加到 Java 构建路径 -> 库部分中项目的类路径中(我希望用户以这种方式或通过 maven 使用该库)。

最佳答案

取决于你如何运行脚本?有几种方法,

  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())

关于java - 使用 root loader 加载 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com