【发布时间】:2018-03-23 12:07:48
【问题描述】:
以下代码将 jar 文件添加到构建路径,它适用于 Java 8。但是,它会抛出 Java 9 异常,该异常与 URLClassLoader 的转换有关。有什么想法可以解决这个问题吗?最佳解决方案将对其进行编辑以与 Java 8 和 9 一起使用。
private static int AddtoBuildPath(File f) {
try {
URI u = f.toURI();
URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<URLClassLoader> urlClass = URLClassLoader.class;
Method method = urlClass.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(urlClassLoader, u.toURL());
} catch (NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException | MalformedURLException | IllegalAccessException ex) {
return 1;
}
return 0;
}
【问题讨论】:
-
来自 JDK 9 发行说明:“应用程序类加载器不再是 java.net.URLClassLoader 的实例(以前版本中从未指定的实现细节)。假定 ClassLoader 的代码。 getSytemClassLoader() 返回一个需要更新的 URLClassLoader 对象。请注意,Java SE 和 JDK 不为应用程序或库提供 API 以在运行时动态增加类路径。”。所以我认为你应该解释你真正需要做什么,以便提出替代方案。
-
你有一个接口和许多潜在的实现——这听起来像是服务和 ServiceLoader 的一个很好的候选者,不需要动态调整类路径来做到这一点。
-
@AlanBateman 但是如果我想让用户在运行时选择实现,那么我仍然必须使用 URLClassLoader 将其动态添加到类路径中,对吧?
-
另外,我注意到使用 ServiceLoader 需要提供者添加具有特定配置的 Meta-INF,这在我的场景中是不可能的,因为我无法控制实现提供者。
标签: java classloader java-9 urlclassloader