在java 9下运行时将jar添加到类路径 [英] Add jar to classpath at runtime under java 9

查看:920
本文介绍了在java 9下运行时将jar添加到类路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆