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()});

Now with java9 we have problem:

Exception in thread "main" java.lang.ClassCastException:

java.base/jdk.internal.loader.ClassLoaders$AppClassLoader

cannot be cast to java.base/java.net.URLClassLoader

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?

解决方案

The JavaSE9 release notes read about the same :

The application class loader is no longer an instance of

java.net.URLClassLoader (an implementation detail that was never

specified in previous releases).

Code that assumes that

ClassLoader::getSytemClassLoader returns a URLClassLoader object will

need to be updated.

Note that Java SE and the JDK do not provide an

API for applications or libraries to dynamically augment the class

path at run-time.

Additionally when an extended classpath is required, one can make use of

Class> clazz = Class.forName("nameofclass", true, new URLClassLoader(urlarrayofextrajarsordirs));

as suggested in this thread from Oracle. This comes with caveats:

java.util.ServiceLoader uses the thread's ClassLoader context Thread.currentThread().setContextClassLoader(specialloader);

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 uses the thread's ClassLoader context (important for javax.mail).

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐