gpt4 book ai didi

java - classloader:如何加载不同版本的jar

转载 作者:行者123 更新时间:2023-12-02 02:34:51 24 4
gpt4 key购买 nike

我必须使用第 3 方平台,但该平台具有无法替换的较旧版本的 jar libjar-1.0.0.jar。该平台允许我在其上运行我自己的(平面文件)包。我将新版本的 libjar-2.0.0.jar 放在我的包/packages/package-name/external-jar 下。当我使用 URLClassLoader 加载 libjar-2.0.0.jar 然后打印出所有声明的方法时,我能够看到 2.0.0 jar 中的方法。但是,当我调用时,我总是收到 NoSuchMethodException。当我打印出 newobj.class.getProtectionDomain().getCodeSource().getLocation().toString() 时,它始终显示 libjar-1.0.0.jar 。谁能帮助解释我做错了什么以及我需要做什么才能在运行时强制使用特定 jar 中的类?

这是我的代码的快照

File f = new File(path);

URL[] urls = new URL[1];
urls[0] = f.toURI().toURL();
ClassLoader cl = new URLClassLoader(urls);

Class<?> utilsClass = cl.loadClass("com.myclass");
Constructor<?> cons = utilsClass.getConstructor(First.class, Second.class);
Object utils = cons.newInstance(firstObj, new Second());
if (utilsClass.getProtectionDomain() != null) {
LOGGER.info(utilsClass.getProtectionDomain().getCodeSource().getLocation().toString());
}
// this print out --- 1.0.0.jar instead of 2.0.0.jar

for (Method m : utilsClass.getDeclaredMethods()) {
LOGGER.info("methods: " + m.getName());
}
// method shows the "methodILookFor"

Method m = utilsClass.getDeclaredMethod("methodILookFor", Target.class, String[].class, Object.class);
// always throws NoSuchMethodException

m.invoke(utils, target, string, obj);

最佳答案

您可以尝试使用自定义类加载器来使用其完全限定名称来加载类,而不是使用 URL 类加载器。使用这种方法,您应该能够绕过父类加载器的类加载委托(delegate),这在您的情况下会导致问题。所以你的类加载器应该能够从 libjar-2.0.0.jar 加载类。

关于java - classloader:如何加载不同版本的jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537199/

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