Java 9:如何动态添加更多jar文件到类路径
Java 9: how to add further jar files to classpath dynamically
我们基于 Java 的应用程序有一个很小的 "bootloader.jar" 和核心应用程序 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:
Note that Java SE and the JDK do not provide an API for applications or
libraries to dynamically augment the class path at run-time.
有人可以证实吗?
我认为它应该仍然有效。最简单的了解方法就是尝试一下。来自同一个 Oracle 页面:
Code that assumes that ClassLoader::getSytemClassLoader
returns a URLClassLoader
object will need to be updated.
您的代码不依赖 URLClassloader
类型的系统类加载器。它所做的只是将其设置为自定义类加载器的委托父级。这个自定义类加载器将委托它搜索 类 和资源,而不管其实现如何。
我们基于 Java 的应用程序有一个很小的 "bootloader.jar" 和核心应用程序 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:
Note that Java SE and the JDK do not provide an API for applications or libraries to dynamically augment the class path at run-time.
有人可以证实吗?
我认为它应该仍然有效。最简单的了解方法就是尝试一下。来自同一个 Oracle 页面:
Code that assumes that
ClassLoader::getSytemClassLoader
returns aURLClassLoader
object will need to be updated.
您的代码不依赖 URLClassloader
类型的系统类加载器。它所做的只是将其设置为自定义类加载器的委托父级。这个自定义类加载器将委托它搜索 类 和资源,而不管其实现如何。