2011-03-21 11 views
11

Hasta ahora, los ejemplos que he visto para ClassLoaders personalizados implican la subclasificación de URLClassLoader y el uso de esa instancia específica para cargar clases en los recursos.Classloader de sistema de reemplazo para clases en tarros que contienen tarros

He intentado en vano buscar métodos alternativos para reemplazar el SystemClassLoader, de modo que se pueda consultar mi ClassLoader para las clases que no se encuentran en el classpath.

Intenté Thread.currentThread().setContextClassLoader, pero parece que no funciona.

¿Es posible?

+0

Cuando dices "para que mi ClassLoader pueda ser consultado para las clases que no se encuentran en el classpath", ¿te refieres a las clases normales del sistema como 'java.lang. *' Etc. o quieres cargar clases adicionales de terceros? – Pacerier

+0

clases de terceros ... – Olaseni

Respuesta

8

Run JVM con java.system.class.loader propiedad:

java -Djava.system.class.loader=myClassLoader myApplication 
+3

Estoy buscando una solución que impida la modificación de la línea de comandos de JVM – Olaseni

+0

No hay tal solución, si desea reemplazar el cargador de clases del sistema. Puede crear en código su cargador de clases propietario y usarlo para cargar las clases, pero no será un cargador de clases del sistema. Por lo general, crear un cargador de clases propietario es una solución suficiente para la mayoría de los casos. – Tarlog

11

Aunque esta es una vieja pregunta, en efecto, hay una forma de reemplazar el cargador de clases del sistema. Puede obtener más de lo que esperaba, sin embargo, con la reflexión.

 Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader 
     scl.setAccessible(true); // Set accessible 
     scl.set(null, new YourClassLoader()); // Update it to your class loader 

Esto debería funcionar en Oracle JVM.

+2

Esto es, por supuesto, un hack dependiendo de una variable privada que podría cambiar entre las versiones de java, pero me permitió solucionar los problemas con one-jar y código en una dependencia de terceros que llama a System.getClassLoader() para cargar una clase . Empujar el cargador de clases de un jarro hasta el tocó el truco. – Gus

+0

@ Xyene después de que termine con mi trabajo: ¿estará bien el comportamiento de la aplicación si devuelvo el cargador de clases a URLClassLoader.getSystemClassLoader()? – ha9u63ar

+0

@ ha9u63ar Supongo que depende de tu caso de uso; si no tiene cuidado, es muy probable que sus clases tengan problemas de visibilidad (por ejemplo, la clase A cargada desde el cargador de clases del sistema no podrá ver la clase B desde la suya). Han pasado algunos años desde que hice algo así, pero puede que no haya un beneficio para recuperar el cargador del sistema. – Xyene

Cuestiones relacionadas