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 aURLClassLoader
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
usingClass.forName("drivername", true, new
URLClassLoader(urlarrayofextrajarsordirs).newInstance();
javax.activation
uses the thread’s ClassLoader context (important for javax.mail).