2010-03-29 59 views
12

我正在为已经多模块的maven项目创建额外的模块。对于这个我希望所有的东西都像其他模块(意义上的依赖关系)一样,只是为了测试hello world,然后我会去做一些更复杂的东西。当它被部署到jboss服务器上时它确实应该打印hello world,但是我在控制台上发现了一些奇怪的错误,是否有人有类似的经历?我该如何解决它?那就是:奇怪的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". 

这里的Appender XML的一部分

http://pastebin.com/X7Dgdrki

回答

16

首先检查你的<server>/conf/jboss-log4j.xml名为FILE的附加器的配置(如果你可以在这里发布它 - 这可能给我们更多的线索)。

进一步调查发现,org.jboss.logging.appender.FileAppender实际上实现了接口org.apache.log4j.Appender。所以这显然是一个类加载器冲突。当由两个不同的类加载器加载时,相同的类定义(在这种情况下为org.apache.log4j.Appender)被视为JVM的两个不同的类。

是否将log4j.jar包含在您的war或您的server/lib目录中?如果是这样,你可以尝试删除它,看看它是否解决了这个问题。

更新:实际上,最简单的解决方案是简单地将appender的类型更改为jboss-log4j.xml中的org.apache.log4j.FileAppender

关于log4j.jar,我的意思是,如果它出现在你的战争中,它(和org.apache.log4j.Appender的副本)被战争类加载器(在你的错误消息中为[email protected])加载。这会导致类加载器冲突。所以如果你没有在你的战争中部署log4j.jar,错误可能会消失。这只与Maven相关,因为在你的pom中配置了依赖关系。对于这个小实验,你可以简单地从你的战争中手动移除log4j.jar;是否能解决问题,配置log4j的依赖在你的pom作为“规定”,如:

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

如果log4j.jar是不是在你的战争,它可能仍然是在服务器/缺省的/ lib目录下 - 请检查它,如果它在那里,请尝试删除它。

+0

@彼得Török感谢你的回答我更新了我的问题,我用Maven构建的项目,所以我有一个罐子.. – ant 2010-03-29 08:55:13

+0

@ c0mrade看到我的更新没有问题。 – 2010-03-29 09:16:15

+1

加入提供的伎俩,你能解释为什么吗? – ant 2010-03-29 10:24:25

3

我们最近遇到这个问题。我们尝试了上述建议,但没有奏效。所以我们通过用抽象日志记录接口(我们为此选择了org.apache.commons.logging)替换所有log4j导入并从depdenancies中移除log4j来处理了这个问题。那么会发生什么呢是实际的底层日志实现支持JBoss设置的任何东西。如果我们想回到Tomcat(没有JBoss),我们可以添加log4j jar或任何记录器实现回战争。