【问题标题】:Java 9: how to add further jar files to classpath dynamically [duplicate]Java 9:如何动态地将更多 jar 文件添加到类路径 [重复]
【发布时间】:2018-01-04 10:48:10
【问题描述】:

我们基于 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:

请注意,Java SE 和 JDK 不为应用程序或 库以在运行时动态增加类路径。

有人可以确认吗?

【问题讨论】:

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

标签: java jar java-9


【解决方案1】:

我认为它应该仍然有效。最简单的了解方法是尝试一下。从同一 Oracle 页面:

假定ClassLoader::getSytemClassLoader 返回URLClassLoader 对象的代码需要更新。

您的代码不依赖于URLClassloader 类型的系统类加载器。它所做的只是将其设置为自定义类加载器的委托父级。此自定义类加载器将委托给它搜索类和资源,而不管其实现如何。

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2014-09-28
    • 2016-07-10
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多