2010-03-29 20 views
12

Estoy creando un módulo adicional para un proyecto maven ya de varios módulos. Y para este quiero que todo sea como en otros módulos (es decir, dependencias) solo para probar hello world, luego iré a hacer cosas más complejas. Y se imprime hola mundo como debería cuando se implementa en el servidor jboss, pero me sale un error extraño en la consola, ¿alguien había tenido una experiencia similar? y como puedo arreglarlo? Aquí está:Error extraño de la consola jboss

15:48:35,789 ERROR [STDERR] log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. 
15:48:35,789 ERROR [STDERR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 
15:48:35,790 ERROR [STDERR] log4j:ERROR [[email protected]{vfszip:/C:/jboss-5.1.0.GA/server/default/deploy/new-module-0.0.1-SNAPSHOT.war/}] whereas object of type 
15:48:35,790 ERROR [STDERR] log4j:ERROR "org.jboss.logging.appender.FileAppender" was loaded by [[email protected]]. 
15:48:35,790 ERROR [STDERR] log4j:ERROR Could not instantiate appender named "FILE". 

aquí es la parte de Appender de XML

http://pastebin.com/X7Dgdrki

Respuesta

16

primero revisa el <server>/conf/jboss-log4j.xml para la configuración de la appender llamado FILE (y que lo ponga aquí si puedes - que pueden danos más pistas).

La investigación adicional revela que org.jboss.logging.appender.FileAppender realmente implementa la interfaz org.apache.log4j.Appender. Así que este es aparentemente un conflicto de cargador de clases. La misma definición de clase (en este caso org.apache.log4j.Appender), cuando es cargada por dos cargadores de clases diferentes, cuenta como dos clases distintas para la JVM.

¿Está incluido log4j.jar en su guerra, o en su directorio server/lib? Si es así, podrías intentar eliminarlo y ver si resuelve el problema.

Actualización: En realidad, la solución más fácil es simplemente cambiar el tipo de appender a org.apache.log4j.FileAppender en jboss-log4j.xml.

En cuanto a log4j.jar, lo que quiero decir es que si está presente en su guerra, (y una copia de org.apache.log4j.Appender) se carga por el cargador de clases war ([email protected] en su mensaje de error). Y esto causa el conflicto del cargador de clases. Entonces, si no implementa log4j.jar con su guerra, el error puede desaparecer. Esto está relacionado con Maven solo en que la dependencia está configurada en tu pom. Para este pequeño experimento, puedes simplemente eliminar el log4j.jar de tu guerra a mano; Si esto resuelve el problema, configure la dependencia log4j en su pom como "siempre", por ejemplo:

<dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.12</version> 
     <scope>provided</scope> 
    </dependency> 

Si log4j.jar no está en su guerra, aún podría estar en el directorio server/default/lib - por favor revise eso y si está allí, intente eliminarlo.

+0

@ Péter Török gracias por su respuesta He actualizado mi pregunta, estoy construyendo un proyecto con maven, así que no tengo problemas con los tarros .. – ant

+0

@ c0mrade ver mi actualización. –

+1

sumando siempre que hiciera el truco, ¿se preocupan por explicar por qué? – ant

3

Recientemente nos encontramos con este problema. Probamos las sugerencias anteriores y no funcionaron. Así que manejamos el problema reemplazando todas las importaciones de log4j con una interfaz de registro abstracta (elegimos org.apache.commons.logging para esto) y eliminando el log4j de las depravancias. Entonces, lo que ocurre es que la implementación del registro subyacente real admite todo lo que JBoss ha establecido. Y si queremos volver a Tomcat (sin JBoss) podemos simplemente agregar el log4j jar o la implementación de cualquier registrador a la guerra.