在java 9下运行时将jar添加到类路径 [英] Add jar to classpath at runtime under java 9
问题描述
在 java9 之前,将外部jar添加到类路径在运行时通过编程方式使用每个人:
Until java9 for adding external jar to classpath in runtime by programmatically everybody used:
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.invoke(sysloader, new Object[]{file.toURI().toURL()});
现在使用java9我们遇到问题:
Now with java9 we have problem:
线程main中的异常java.lang.ClassCastException:
java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader
无法强制转换为java.base / java .net.URLClassLoader
Exception in thread "main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader
URLClassLoader
在Java 9中不再起作用。现在在jdk9下如何以编程方式在运行时向类路径添加外部jar?
URLClassLoader
doesn't work anymore in Java 9. What to do now under jdk9 for adding an external jar to the classpath in runtime programmatically?
推荐答案
JavaSE9发行说明阅读相同内容:
应用程序类加载器不再是
的实例java.net.URLClassLoader
(一个在以前的版本中从未指定
的实现细节)。
The application class loader is no longer an instance of
java.net.URLClassLoader
(an implementation detail that was never specified in previous releases).
假设
的代码 ClassLoader :: getSytemClassLoader
返回 URLClassLoader
对象将需要更新
。
Code that assumes that
ClassLoader::getSytemClassLoader
returns a URLClassLoader
object will
need to be updated.
请注意, Java SE和JDK不为应用程序或库提供
API,以便在运行时动态扩充类
路径-time 。
此外,当需要扩展类路径时,可以使用
Additionally when an extended classpath is required, one can make use of
Class<?> clazz = Class.forName("nameofclass", true, new URLClassLoader(urlarrayofextrajarsordirs));
如来自Oracle的线程。这有警告:
java.util.ServiceLoader
使用线程的ClassLoader上下文Thread.currentThread()。setContextClassLoader(specialloader);
java.util.ServiceLoader
uses the thread's ClassLoader context Thread.currentThread().setContextClassLoader(specialloader);
java.sql.DriverManager
确实尊重调用类'ClassLoader,而不是Thread的ClassLoader。使用 Class.forName(drivername,true,new
URLClassLoader(urlarrayofextrajarsordirs).newInstance();
java.sql.DriverManager
does honors the calling class' ClassLoader, -not- the Thread's ClassLoader. Create Driver directly
using Class.forName("drivername", true, new
URLClassLoader(urlarrayofextrajarsordirs).newInstance();
javax.activation
使用线程的ClassLoader上下文(对javax.mail很重要)。
javax.activation
uses the thread's ClassLoader context (important for javax.mail).
这篇关于在java 9下运行时将jar添加到类路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!