代码之家  ›  专栏  ›  技术社区  ›  ant

奇怪的jboss控制台错误

  •  13
  • ant  · 技术社区  · 15 年前

    我正在为已经多个模块的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 回复  |  直到 13 年前
        1
  •  18
  •   Péter Török    15 年前

    首先检查您的 <server>/conf/jboss-log4j.xml 对于名为 FILE (如果你可以的话,把它贴在这里——这可能会给我们更多的线索)。

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

    log4j.jar是包含在您的war中,还是包含在您的服务器/lib目录中?如果是,您可以尝试删除它,看看它是否解决了问题。

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

    关于log4j.jar,我的意思是如果它出现在你的战争中,它(和 org.apache.log4j.appender网站 )由WAR类加载器加载( BaseClassLoader@9a8d9b 在错误信息中)。这会导致类加载器冲突。因此,如果不在war中部署log4j.jar,错误可能会消失。这只与maven相关,因为依赖项是在pom中配置的。对于这个小实验,您只需手动从war中删除log4j.jar;如果这解决了这个问题,请将pom中的log4j依赖项配置为“provided”,例如:

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

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

        2
  •  3
  •   Mr. Mundkowsky    13 年前

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