【问题标题】:Strange jboss console error奇怪的jboss控制台错误
【发布时间】:2011-02-01 22:55:56
【问题描述】:

我正在为已有的多模块 maven 项目创建附加模块。对于这个,我希望一切都像其他模块(意思是依赖项)一样,只是为了测试你好世界,然后我会去做一些更复杂的事情。当部署到 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

【问题讨论】:

    标签: java maven jboss log4j classloader


    【解决方案1】:

    首先检查您的 <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 目录中?如果是这样,您可以尝试将其删除,看看是否可以解决问题。

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

    关于 log4j.jar,我的意思是,如果它存在于您的战争中,它(以及org.apache.log4j.Appender 的副本)会被战争类加载器(错误消息中的BaseClassLoader@9a8d9b)加载。这会导致类加载器冲突。因此,如果您不使用您的战争部署 log4j.jar,错误可能会消失。这仅与 Maven 相关,因为在您的 pom.xml 中配置了依赖项。对于这个小实验,您可以简单地手动从您的战争中删除 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 目录中 - 请检查它,如果它在那里,请尝试将其删除。

    【讨论】:

    • @Péter Török 谢谢你的回答我更新了我的问题,我正在用 maven 构建项目,所以我对 jars 没有任何问题..
    • 添加 provided 成功了,想解释一下原因吗?
    • @c0mrade 很高兴听到 :-) 它之所以有效,是因为默认情况下,Maven 会打包战争中的所有依赖项。 “provided”范围告诉 Maven 这个 jar 是由目标环境提供的,所以没有必要将它包含在 war 中。更多详情见maven.apache.org/guides/introduction/…
    • 我对 log4j 没有任何依赖关系,我的战争中也没有 log4.jar,所以我该怎么办。谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 2018-10-03
      • 2017-10-08
      • 1970-01-01
      • 2020-03-29
      • 2015-07-20
      • 2023-03-18
      • 2020-03-09
      相关资源
      最近更新 更多