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肯定配置好后才进行发布的,
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
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的具体配置参数可百度,这个比较多说明,
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设置是无效的,如下图所示。
7、最后我只能没办法的情况下,到github里面下载了jboss logging的代码,在logger方法里面加入了getLoggerPlugin()的方法进去,然后在jboss eap的modules里面的module.xml,将jar路径改为我的编译新生成的jar包(jboss-logging-3.3.1.Final-SNAPSHOT.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包的源码。