Jboss eap 6.4 logging jar包冲突

时间:2021-01-04 09:17:43

jboss eap 6.4 作为最新的jboss发布版本,最近项目用到了这个jboss eap,要之前在tomcat项目移植到jboss,而且还是移植到

jboss的最新版本上,都不知道更新了多少不同的东西,同时我们还有到我们自己的写的数据源(ZtdDataSource),一路转得很痛

苦,其实就是由于自己写的数据源导致与jboss的核心jar包冲突,才出现问题的,本文只是备注该jar包冲突情况的解决方式:


1、首先在说明问题情况和解决之前,你必须有安装jboss eap 6系列,为什么怎么说,因为 jboss eap 6系列以下与现在jboss eap 6

系列的还是有比较大的差别的,而在项目的发布上我是采用jboss eap 6.4的standalone模式(也就是独立模式)。


2、一开始我将jboss嵌入到我的Myeclipse里面进去,然后启动项目程序直接发布,当然了关于standalone.xml肯定配置好后才进行发布的,

Jboss eap 6.4 logging jar包冲突


3、发布之后项目突然报出一个错误,这就开启了我苦逼的解决之路。

Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.getLoggerPlugin()Lorg/jboss/logging/LoggerPlugin;

原来项目里自写的数据源里面记录日志是使用了jboss-common-4.2.2.GA.jar里面的logger方法,但是jboss eap 里面是自带有这个jboss的logging方法的,因此你在代码里面如果是使用了import org.jboss.logging.Logger的话,默认是走jboss eap自带的方法,也就是我项目的日志jar包是没有被调用,导致方法缺失,所以解决的思路有2种:

(一)、去除掉自己项目里面的日志getLoggerPlugin方法,改为一般的error或者debug输出。(要改动的话,数据源的代码太麻烦了因此选择了第二种方法)

(二)、屏蔽jboss eap 自带的logging或者显性调用项目里面的jboss-common-4.2.2.GA.jar的logging方法

jar的名称:jboss-logging-3.1.4.GA-redhat-2.jar

Jboss eap 6.4 logging jar包冲突


4、于是我开始jboss eap 屏蔽jar使用的方式,由于之前jboss eap 5.1系列的是采用jboss-web.xml来屏蔽jar,然后配置jboss-web.xml放在到WEB-INF里面,启动时候会报错,识别不了class-loading元素,后面查了官方资料才知道在jboss eap 6系列不再支持采用jboss-web.xml来配置加载顺序和屏蔽,而是采用jboss-deployment-structure.xml进行配置,jboss-deployment-structure.xml的具体配置参数可百度,这个比较多说明,

Jboss eap 6.4 logging jar包冲突

5、在jboss-deployment-structure.xml配置移除logging引用均无效,但是配置了org.apache.commons.pool移除和pool2添加确是成功正常的。

(看官方文档里面说明的时候,看到可以在logging的配置里面add-logging-api-dependencies属性为false,可以关闭自带日志,但是如何这配置一直没有配置成功。。。

配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
 <deployment>
   <exclusions>
        <module name="org.apache.commons.pool" />
        <module name="org.jboss.as.logging"/>
        <module name="org.apache.log4j"/>
        <module name="org.jboss.logging"/>
    </exclusions>

    <dependencies>
      <module name="org.apache.commons.pool2" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>


6、经过排查之后,发现有一个可能,那就是jboss的jar包是不能移除的,因为在standalone.xml里面已经定义了加载,所以我在jboss-deployment-structure.xml设置是无效的,如下图所示。

Jboss eap 6.4 logging jar包冲突


7、最后我只能没办法的情况下,到github里面下载了jboss logging的代码,在logger方法里面加入了getLoggerPlugin()的方法进去,然后在jboss eap的modules里面的module.xml,将jar路径改为我的编译新生成的jar包(jboss-logging-3.3.1.Final-SNAPSHOT.jar),就能正常启动,不再报冲突了,如下图:

Jboss eap 6.4 logging jar包冲突

module.xml如下

<module xmlns="urn:jboss:module:1.1" name="org.jboss.logging">
    <resources>
        <!--    <resource-root path="jboss-common-4.2.2.GA.jar"/> -->
		<resource-root path="jboss-logging-3.3.1.Final-SNAPSHOT.jar"/>
        <!-- Insert resources here  <resource-root path="jboss-logging-3.1.4.GA-redhat-2.jar"/> -->
    </resources>
	    <!-- 
     <properties>
        <property name="jboss.api" value="private"/>
    </properties>
	-->
    <dependencies>
        <module name="org.jboss.logmanager"/> 
    </dependencies>
</module>


8、总结最后得到结论是:jboss-deployment-structure.xml 能够屏蔽jboss eap 90%的jar包冲突,但是涉及到jboss eap 本身自己的jar时,就无能为力,最好的方法是在项目中移除jboss本身有冲突的jar包,如果实在不行,就跟我一样改jar包的源码。