2010-03-29 10 views
12

Je crée un module supplémentaire pour un projet maven déjà multi-module. Et pour celui-ci je veux que tout soit comme dans les autres modules (signifiant dépendances) juste pour tester bonjour monde, alors je vais faire des choses plus complexes. Et il imprime bonjour le monde comme il se doit quand il est déployé sur le serveur jboss, mais j'ai une étrange erreur sur la console, est-ce que quelqu'un avait une expérience similaire? et comment puis-je le réparer? Ici, il est:Erreur étrange de la console 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". 

Voici la partie de Appender xml

http://pastebin.com/X7Dgdrki

Répondre

16

Vérifiez d'abord votre <server>/conf/jboss-log4j.xml pour la configuration du appender nommé FILE (et le poster ici si vous le pouvez - qui peut donnez-nous plus d'indices). Une autre enquête révèle que org.jboss.logging.appender.FileAppender implémente effectivement l'interface org.apache.log4j.Appender. Donc, il s'agit apparemment d'un conflit de classloader. La même définition de classe (dans ce cas, org.apache.log4j.Appender), lorsqu'elle est chargée par deux chargeurs de classe différents, compte comme deux classes distinctes pour la machine virtuelle Java.

Est-ce que log4j.jar est inclus dans votre war, ou dans votre répertoire server/lib? Si c'est le cas, vous pouvez essayer de le supprimer et voir s'il résout le problème.

Mise à jour: En fait, la solution la plus simple possible est de changer simplement le type de appender à org.apache.log4j.FileAppender dans jboss-log4j.xml. En ce qui concerne log4j.jar, ce que je veux dire est que s'il est présent dans votre guerre, il (et une copie de org.apache.log4j.Appender) est chargé par le chargeur de classe de guerre ([email protected] dans votre message d'erreur). Et cela provoque le conflit du classloader. Donc, si vous ne déployez pas log4j.jar avec votre guerre, l'erreur peut disparaître. Ceci est lié à Maven seulement en ce que la dépendance est configurée dans votre pom. Pour cette petite expérience, vous pouvez simplement enlever le log4j.jar de votre guerre à la main; si cela résout le problème, configurez la dépendance log4j dans votre pom comme « prévu », par exemple:

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

Si log4j.jar est pas dans votre guerre, il pourrait encore être dans le serveur/répertoire par défaut/lib - s'il vous plaît vérifier cela et si c'est là, essayez de le supprimer.

+0

@ Péter Török je vous remercie pour votre réponse J'ai mis à jour ma question, je construis un projet avec maven donc je n'ai pas de problèmes avec les pots .. – ant

+0

@ c0mrade voir ma mise à jour. –

+1

ajoutant fourni fait l'affaire, soin d'expliquer pourquoi? – ant

3

Nous avons récemment rencontré ce problème. Nous avons essayé les suggestions ci-dessus et ils n'ont pas fonctionné. Nous avons donc géré le problème en remplaçant toutes les importations log4j par une interface de journalisation abstraite (nous avons choisi org.apache.commons.logging pour cela) et en supprimant le log4j des dépendances. Alors, que se passe-t-il, l'implémentation de journalisation sous-jacente actuelle prend en charge tout ce que JBoss a défini. Et si nous voulons revenir à Tomcat (sans JBoss), nous pouvons simplement ajouter le fichier log4j jar ou toute autre implémentation de logger dans la guerre.