java - JBoss ClassLoading Parent-Última carga
classloader (1)
Quería entender la última carga de los padres en una aplicación del servidor de aplicaciones JBoss. Tenemos una aplicación heredada desplegada en JBoss 4.2.1 GA. Para lo cual estamos intentando la última carga de los padres.
Me refiero al este enlace . Quería aprender a un padre cargando por última vez. Así que había creado una aplicación de paquete maven jar simple con maven-jar-plugin y configuración -> addDefaultImplementationEntries = true. Creé 2 versiones de jar 1.0.0 y 1.0.1 desde la misma aplicación maven de creación de jar. El jar tiene TestClass de clase única y un método de retorno de cadena simple que devuelve la versión del jar de la que se carga la clase. lo que quería experimentar el uso de java2ClassLoadingCompliance . He empaquetado el archivo jar de la versión 1.0.0 en el servidor / deploy / MyApplication / WEB-INF / lib (Mi aplicación web es una aplicación de servlet simple que llama al método de la clase y, por lo tanto, imprime el número de versión desde el que se invocó el jar .) y la versión 1.0.1 jar en server / lib.
Nota : Lógicamente, no tiene sentido utilizar una versión anterior de jar en la aplicación y anularla con la versión más reciente presente en el servidor lib, pero solo quería experimentar la carga de la clase.
He probado lo siguiente
- Sin ningún jboss-web.xml en la carpeta meta-inf.
- Probé la introducción de jboss-we.xml en META-INF y haciendo lo mismo con java2ClassLoadingCompliance = false.
- Con java2ClassLoadingCompliance = verdadero.
Toda la clase de tiempo de la lib de la aplicación sería cargada por la aplicación.
Mi jboss-web.xml parece una referencia
<jboss-web>
<class-loading java2ClassLoadingCompliance="true">
<loader-repository>
com.example:archive=JBossClassLoadingTestServlet-0.0.1-SNAPSHOT.ear
<loader-repository-config>java2ParentDelegation=true</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
¿Puede alguien ayudarme a entender la configuración de los padres en JBoss? ¿Cuál es el error que estoy haciendo aquí que siempre se carga la clase de la aplicación lib?
Me temo que su enlace no está tan relacionado con su experimento. Está más relacionado con las implementaciones de EAR, en las que existen implementaciones de múltiples módulos y necesitan múltiples versiones de la lib para aislar.
En tu caso, solo anulas lib en un Jar.
Lo siguiente es de Servlet Spec:
También se recomienda que el cargador de clases de aplicaciones se implemente de modo que las clases y recursos empaquetados dentro de WAR se carguen con preferencia a las clases y recursos que residen en los JAR de bibliotecas de todo el contenedor.
Entonces, JBoss sigue las especificaciones y siempre carga la lib de aplicación primero.
No encontré el documento de la versión anterior, pero debería ser similar a AS7 :
En orden de mayor prioridad a menor prioridad
- Dependencias del sistema: son dependencias que el contenedor agrega automáticamente al módulo, incluidas las API de Java EE.
- Dependencias del usuario: son dependencias que se agregan a través de JBoss-deployment-structure.xml o a través de Dependencias: entrada de manifiesto.
- Recurso local: archivos de clase empaquetados dentro de la implementación, p. Ej. Archivos de clase de WEB-INF / classes o WEB-INF / lib de una guerra.
- Dependencias entre implementaciones: son dependencias de otras implementaciones en una implementación ear. Esto puede incluir clases en el directorio lib de una oreja, o clases definidas en otras jarras EJB.
Relacionado: