Add jar to classpath at runtime under java 9

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).

Leave a Comment