在java 9下运行时将jar添加到类路径
直到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我们有问题:
线程“main”中的exceptionjava.lang.ClassCastException:java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader无法强制转换为java.base / java.net.URLClassLoader
URLClassLoader
在Java 9中不再起作用。现在在jdk9下如何以编程方式在运行时向类路径添加外部jar?
JavaSE9发行说明读到了同样的内容:
应用程序类加载器不再是
java.net.URLClassLoader
的实例(以前版本中从未指定的实现细节)。假定
ClassLoader::getSytemClassLoader
返回URLClassLoader
对象的代码需要更新。请注意, Java SE和JDK不为应用程序或库提供API,以便在运行时动态扩充类路径 。
另外,当需要扩展类路径时,可以使用
Class> clazz = Class.forName("nameofclass", true, new URLClassLoader(urlarrayofextrajarsordirs));
正如Oracle的这个post所建议的那样。 这有一些警告:
java.util.ServiceLoader
使用线程的ClassLoader上下文Thread.currentThread()。setContextClassLoader(specialloader);
java.sql.DriverManager
确实尊重调用类’ClassLoader,而不是Thread的ClassLoader。 使用Class.forName("drivername", true, new URLClassLoader(urlarrayofextrajarsordirs).newInstance();
直接创建驱动程序Class.forName("drivername", true, new URLClassLoader(urlarrayofextrajarsordirs).newInstance();
javax.activation
使用线程的ClassLoader上下文(对javax.mail很重要)。