gpt4 book ai didi

java - 在运行时动态加载 jar?

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:44 28 4
gpt4 key购买 nike

我当前的 java 项目正在使用另一个项目(同一个包)中的方法和变量。现在另一个项目的 jar 必须在类路径中才能正常工作。我这里的问题是 jar 的名称可以并且将会随着版本的增加而改变,并且因为你不能在 list 类路径中使用通配符,所以不可能将它添加到类路径中。因此,目前启动我的应用程序的唯一选择是使用命令行中的 -cp 参数,手动添加我的项目所依赖的其他 jar。

为了改进这一点,我想动态加载 jar 并阅读有关使用 ClassLoader 的信息。我阅读了很多它的例子,但我仍然不明白如何在我的案例中使用它。

我想要的是加载一个 jar 文件,比方说,myDependency-2.4.1-SNAPSHOT.jar,但它应该能够只搜索以 开头的 jar 文件>myDependency- 因为正如我已经说过的,版本号可以随时更改。然后我应该能够像现在一样在我的代码中使用它的方法和变量(比如 ClassInMyDependency.exampleMethod())。

任何人都可以帮我解决这个问题,因为我已经在网上搜索了几个小时,但仍然不知道如何使用 ClassLoader 来完成我刚才解释的事情。

提前致谢

最佳答案

(适用于 Java 版本 8 及更早版本)。


确实这偶尔是必要的。这就是我在生产中的做法。它利用反射来绕过系统类加载器对addURL的封装。

/*
* Adds the supplied Java Archive library to java.class.path. This is benign
* if the library is already loaded.
*/
public static synchronized void loadLibrary(java.io.File jar) throws MyException
{
try {
/*We are using reflection here to circumvent encapsulation; addURL is not public*/
java.net.URLClassLoader loader = (java.net.URLClassLoader)ClassLoader.getSystemClassLoader();
java.net.URL url = jar.toURI().toURL();
/*Disallow if already loaded*/
for (java.net.URL it : java.util.Arrays.asList(loader.getURLs())){
if (it.equals(url)){
return;
}
}
java.lang.reflect.Method method = java.net.URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{java.net.URL.class});
method.setAccessible(true); /*promote the method to public access*/
method.invoke(loader, new Object[]{url});
} catch (final java.lang.NoSuchMethodException |
java.lang.IllegalAccessException |
java.net.MalformedURLException |
java.lang.reflect.InvocationTargetException e){
throw new MyException(e);
}
}

关于java - 在运行时动态加载 jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27187566/

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