在java 9下运行时将jar添加到类路径

Evg*_*rov 12 java jar classpath urlclassloader java-9

直到在运行时通过编程方式将所有人使用的外部jar添加到类路径:

URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.invoke(sysloader, new Object[]{file.toURI().toURL()});
Run Code Online (Sandbox Code Playgroud)

现在用java9我们有问题:

线程"main"中的异常java.lang.ClassCastException:java.base/jdk.internal.loader.ClassLoaders $ AppClassLoader无法强制转换为java.base/java.net.URLClassLoader

URLClassLoader 在Java 9中不再有效.在jdk9下如何以编程方式在运行时向类路径添加外部jar?

Nam*_*man 8

JavaSE9发行说明阅读是一样的:

应用程序类加载器不再是java.net.URLClassLoader(以前版本中从未指定的实现细节)的实例 .

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

请注意,Java SE和JDK不为应用程序或库提供API,以便在运行时动态扩充类路径.

另外,当需要扩展类路径时,可以使用

Class<?> clazz = Class.forName("nameofclass", true, new URLClassLoader(urlarrayofextrajarsordirs));
Run Code Online (Sandbox Code Playgroud)

正如Oracle的这个帖子所建议的那样.这有一些警告:

  • java.util.ServiceLoader 使用线程的ClassLoader上下文Thread.currentThread().setContextClassLoader(specialloader);

  • java.sql.DriverManager确实尊重调用类'ClassLoader, - 不是Thread的ClassLoader.直接使用创建驱动程序Class.forName("drivername", true, new URLClassLoader(urlarrayofextrajarsordirs).newInstance();

  • javax.activation 使用线程的ClassLoader上下文(对javax.mail很重要).

  • @EvgeniyEgorov您可能也想查看[此主题](https://community.oracle.com/thread/4011800),并确定您的要求是什么. (2认同)