Agregue jar a classpath en tiempo de ejecución bajo java 9

Hasta java9 para agregar jar externo a classpath en tiempo de ejecución mediante progtwigción, todos usaron:

URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class}); method.invoke(sysloader, new Object[]{file.toURI().toURL()}); 

Ahora con java9 tenemos un problema:

Excepción en el hilo “principal” java.lang.ClassCastException: java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader no se puede convertir a java.base / java.net.URLClassLoader

URLClassLoader ya no funciona en Java 9. ¿Qué hacer ahora bajo jdk9 para agregar un jar externo a la ruta de clase en tiempo de ejecución mediante progtwigción?

Las notas de la versión de JavaSE9 leen acerca de lo mismo:

El cargador de clases de aplicaciones ya no es una instancia de java.net.URLClassLoader (un detalle de implementación que nunca se especificó en versiones anteriores).

El código que asume que ClassLoader::getSytemClassLoader devuelve un objeto URLClassLoader deberá actualizarse.

Tenga en cuenta que Java SE y JDK no proporcionan una API para aplicaciones o bibliotecas para boost dinámicamente la ruta de la clase en tiempo de ejecución .

Además, cuando se requiere un classpath extendido, uno puede hacer uso de

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

como se sugiere en este hilo de Oracle . Esto viene con advertencias:

  • java.util.ServiceLoader usa el contexto del Cargador de clase del hilo Thread.currentThread (). setContextClassLoader (specialloader);

  • java.sql.DriverManager hace honor a la clase llamante ‘ClassLoader, -not- Thread’s ClassLoader. Cree el controlador directamente utilizando Class.forName("drivername", true, new URLClassLoader(urlarrayofextrajarsordirs).newInstance();

  • javax.activation usa el contexto ClassLoader del hilo (importante para javax.mail).