我正在尝试如my previous post中所述将自定义布局类配置为Log4J。该类使用java.util.regex.Matcher标识日志消息中的潜在信用卡号。它非常适合在单元测试中使用,也可以在包含单个servlet的最小Web应用程序中使用。但是,当我尝试使用我们的应用程序在JBoss中部署它时,出现以下错误:

--- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---
ObjectName: jboss.web.deployment:war=MyWebApp-2010_02-SNAPSHOT.war,id=476602902
  State: FAILED
  Reason: java.lang.LinkageError: java/util/regex/Matcher


我什至找不到这种形式的错误的任何信息-通常LinkageError似乎显示“加载程序约束违规”消息,如here中所示。

技术细节:我们使用JBoss 4.2,Java 5,Log4J 1.2.12。我们将应用程序部署在.ear中,其中包含(除其他外)上述.war文件,以及自定义布局类在单独的jar文件中(我们称为Commons)。我们用位于另一个文件夹中的自己的jboss-log4j.xml覆盖log4j.properties中的默认设置,该文件夹在启动时添加到类路径中,并通过Sapient's Carbon framework提供。

更新到@skaffman的答案:

我们有一个单独的log4j.properties文件的原因是Sapient Carbon传播的方案。这基本上将配置文件和数据文件与应用程序服务器环境解耦,以便可以通过Carbon的查找功能对其进行访问,并将它们存储在应用程序服务器外部的目录中。我们继承了此设置,但我们讨厌它,因为它不遵守JEE约定,这给我们带来了部署,类路径问题等的许多麻烦。我们的目标是从长远角度消除它,但是这需要时间:-(

即使单独的log4j.properties文件不是最佳实践,也可以正常工作。它已经在我们的应用程序中运行了多年,并且我也可以使其与包含单个servlet(不使用Sapient Carbon)的极简网络应用程序一起使用。如果将log4j.properties放入类路径,则在启动Web应用程序时,Log4J会正确读取它,并相应地重新配置日志记录。

更新2:一个有趣的发现是,MyWebApp中甚至没有使用Matcher,仅在Commons模块(和另一个模块,在单独的jar中)中使用了。在Commons中,它以前在名为StringHelper的类中使用,该类由MyWebApp通过其他模块间接使用。

我猜这排除了由不同的类加载器加载两个不同的Matcher类版本的可能性。因此,我唯一剩下的猜测是,当从jar和war中使用Matcher时,Matcher由两个不同的类加载器加载,然后尝试从一个传递到另一个。这由Frank Kieviet's excellent article解释。但是,我相信这样的设置将导致“加载程序约束冲突”,而不是这种形式的错误。

更新#3:如果我在jboss-log4j.xml中添加this appender (example 3.8),该错误消失,并且服务器可以完美运行:-o这显然与加载log4j.jar有关,因为此设置要求必须存在jar在服务器的lib目录中。如果我将附加程序类型更改为org.jboss.logging.appender.FileAppender,并将日志级别设置为WARN,这也会导致ucl.log文件为空,这也可以使用。这可能是一个临时解决方法,但我仍然渴望完全了解这里发生的情况。

此错误消息是什么意思,如何正确修复?



结语

经过漫长的等待,我终于从日志记录过程中消除了Carbon,并将日志记录配置迁移到server/conf/jboss-log4j.xml中。这要求我将自定义日志过滤器类发布到server/lib目录中的单独jar中。此后,类加载将再次起作用,而无需执行上述Update#3中描述的解决方法:-)

最佳答案

我的第一个反应是,在JBoss中不可能像这样覆盖log4j配置。 JBoss不允许log4j定位其自己的配置,就像通常那样,conf/jboss-log4j.xml的位置在conf/jboss-service.xml中指定。

据我所知,给定JBoss服务器中的所有log4j配置必须集中在一个文件中,通常为conf/jboss-log4j.xml

作为测试,您是否尝试过将log4j.properties的内容移动到现有的conf/jboss-log4j.xml文件中?如果这样可以正常工作,那么问题几乎可以肯定是由您尝试覆盖log4j引起的。话虽如此,如果jboss / log4j如此脆弱,我会感到惊讶,但也许在某些情况下,它拒绝了这一点。

09-16 03:33