我们的基于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 库在运行时动态扩充类路径。
有人可以证实吗?
答案 0 :(得分:2)
我认为它应该仍然有用。最简单的方法就是尝试一下。来自同一个Oracle页面:
需要更新假定
ClassLoader::getSytemClassLoader
返回URLClassLoader
对象的代码。
您的代码不依赖于URLClassloader
类型的系统类加载器。它所做的就是将其设置为自定义类加载器的委托父级。无论其实现如何,这个自定义类加载器都会委托它来搜索类和资源。