Java 9:如何动态地将其他jar文件添加到类路径中

3
我们的基于Java的应用程序有一个微小的"bootloader.jar"和核心应用程序JAR包。核心应用程序JAR包可以从默认(文件系统)位置或先前应用程序运行可能已下载更新的位置加载。引导程序运行以下代码:
final List<File> jars = getJarsToAddToClasspath();
final String mainClassName = getMainClassName();

final URLClassLoader urlClassLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]), ClassLoader.getSystemClassLoader());
final Class<?> mainClass = urlClassLoader.loadClass(mainClassName);
final Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
mainMethod.invoke(null, new Object[] {args});

根据http://www.oracle.com/technetwork/java/javase/9-relnote-issues-3704069.html,似乎Java 9不再支持以下功能:请注意,Java SE和JDK不提供应用程序或库在运行时动态增强类路径的API。请问是否有人能够确认这一点?

将一个目录添加到静态类路径中?"lib/*" - Joop Eggen
在启动引导加载程序代码之前,该位置是未知的。该目录可能还包含旧版本的JAR文件,因此我们需要按正确顺序仅添加专用的JAR文件到类路径中。 - Thomas S.
2
问题中的代码示例创建了一个URLClassLoader,它并没有尝试动态扩展应用程序类路径。因此,我认为你不会遇到任何问题。试一下吧 :-) - Alan Bateman
@AlanBateman:是的,它似乎可以工作,但除了“动态扩展类路径”之外,还有什么可以在运行时从任意配置的.jar文件中加载类? - Thomas S.
这个问题不是重复的,因为我的发布代码没有假设任何父类加载器。因此它在Java 9上不会崩溃。 - Thomas S.
1个回答

2
我认为它应该仍然有效。了解最简单的方法是尝试一下。从同一Oracle页面中:
假设ClassLoader :: getSystemClassLoader返回URLClassLoader对象的代码需要更新。
您的代码不依赖于系统类加载器的类型为URLClassloader。它所做的只是将其设置为自定义类加载器的委托父项。此自定义类加载器将委托给它来搜索类和资源,而不考虑其实现方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接