Evg*_*rov 12 java jar classpath urlclassloader java-9
直到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()});
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?
该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)
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很重要).