奇怪的jboss控制台错误

时间:2010-03-29 08:23:10

标签: java maven jboss log4j classloader

我正在为已经多模块的maven项目创建额外的模块。对于这个我希望一切都像其他模块(意味着依赖)一样只是为了测试hello world,然后我会去做一些更复杂的东西。当它部署到jboss服务器上时它确实打印了hello world,但是我在控制台上遇到了一些奇怪的错误,有没有人有类似的经历?我该如何解决?这是:

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 [BaseClassLoader@9a8d9b{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 [org.jboss.bootstrap.NoAnnotationURLClassLoader@506411].
15:48:35,790 ERROR [STDERR] log4j:ERROR Could not instantiate appender named "FILE".

这是Appender xml的一部分

http://pastebin.com/X7Dgdrki

2 个答案:

答案 0 :(得分:18)

首先检查您的<server>/conf/jboss-log4j.xml以获取名为FILE的appender的配置(如果可以,请在此处发布 - 这可能会为我们提供更多线索)。

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

你的战争或服务器/ lib目录中是否包含log4j.jar?如果是这样,您可以尝试删除它,看看它是否能解决问题。

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

关于log4j.jar,我的意思是如果它出现在你的战争中,它(以及org.apache.log4j.Appender的副本)会被war类加载器加载(BaseClassLoader@9a8d9b在你的错误消息中) 。这会导致类加载器冲突。因此,如果您不在战争中部署log4j.jar,则错误可能会消失。这与Maven有关,只是在你的pom中配置了依赖关系。对于这个小实验,您只需手动从战争中删除log4j.jar;如果这解决了问题,请将pom中的log4j依赖关系配置为“提供”,例如:

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

如果log4j.jar不在你的战争中,它可能仍然在server / default / lib目录中 - 请检查它是否存在,尝试删除它。

答案 1 :(得分:3)

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