奇怪的 jboss 控制台错误

2022-09-04 19:30:09

我正在为已经是多模块的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


答案 1

首先检查您指定的附加器的配置(如果可以的话,请在此处发布 - 这可能会给我们提供更多线索)。<server>/conf/jboss-log4j.xmlFILE

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

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

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

关于log4j.jar,我的意思是,如果它存在于你的战争中,它(以及)的副本会被战争类加载器加载(在你的错误消息中)。这会导致类装入器冲突。因此,如果您不部署log4j.jar您的战争,错误可能会消失。这与 Maven 相关,仅在于依赖项是在 pom 中配置的。对于这个小实验,您可以简单地手动从战争中移除log4j.jar;如果这可以解决问题,请将pom中的log4j依赖项配置为“提供”,例如:org.apache.log4j.AppenderBaseClassLoader@9a8d9b

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

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


答案 2

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


推荐