【发布时间】:2018-06-11 00:36:44
【问题描述】:
直到 java9 以编程方式在运行时将外部 jar 添加到类路径中,每个人都使用过:
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.invoke(sysloader, new Object[]{file.toURI().toURL()});
现在使用 java9 我们有问题:
线程“主”java.lang.ClassCastException 中的异常: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader 无法转换为 java.base/java.net.URLClassLoader
URLClassLoader 在 Java 9 中不再工作。现在在 jdk9 下如何以编程方式将外部 jar 添加到运行时的类路径?
【问题讨论】:
-
虽然发行说明中提到当前的 JavaSE/JDK 没有提供任何这样的 API 来在运行时增加类路径。然而,您越能详细说明您最终想要实现的目标,社区就能为您提供更多帮助。
-
ClassLoader.getSystemClassLoader()不再是URLClassLoader,但您可以随时创建URLClassLoader的新实例。 -
@ZhekaKozlov 是正确的,尤其是。如果您无论如何都可以通过反射调用 JAR 文件中的代码。
-
实际上,使用 Java 9,您有两个问题。即使 ClassLoader 实际上是 URLClassLoader,我怀疑在模块化应用程序中是否允许尝试反射。
-
我发现“Gradle”与 UrlClassLoader 有什么问题。有人知道他们是怎么解决的吗?
标签: java9 java jar classpath java-9 urlclassloader