无论是was7还是was8,在安装带有Axis2的应用时,都很容易出现jar冲突的情况,最常见的有以下:
E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet 错误]-[AxisServlet]: org.apache.axis2.deployment.DeploymentException: org.apache.commons.fileupload.FileUploadException
或者
E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[AxisServlet]: java.lang.ClassCastException: com.ibm.xml.xlxp2.api.wssec.WSSXMLInputFactory incompatible with javax.xml.stream.XMLInputFactory
was7比was8好解决一点,之前布署was7时大概查了两周资料才解决,后来迁到was8时,照was7的方法操作还是不行的,再查了一周资料才搞定,基本上,你看到这篇文章时,你在网上查的大部分文章、官网、资料我都有看过。
was版本 7 Axis2版本1.6.2
下面先从was7的解决方式开始说起
1:把modules下的六个文件
addressing-1.6.2.mar
mex-1.6.2.mar
mtompolicy-1.6.2.mar
ping-1.6.2.mar
scripting-1.6.2.mar
soapmonitor-1.6.2.mar
重命名后缀,把.mar改为.jar后放入应用lib目录下
addressing-1.6.2.jar
mex-1.6.2.jar
mtompolicy-1.6.2.jar
ping-1.6.2.jar
scripting-1.6.2.jar
soapmonitor-1.6.2.jar
2:检查应用中是否有关于javaee的包,如
javaee*.jar
servlet-api-*.jar
有的话,删掉,打包时不要包含这些jar包,was容器中自带这些jar包了。
3:检查应用中是否有关于xmlbeans-*.jar的包,因为Axis2带有axis2-xmlbeans-1.6.2.jar了,所以有别的这样的包,也不用了。
4:最重要的一步
修改Classloader策略,企业应用程序 > 你的应用_war > 管理模块 > 你的应用.war
修改类装入器顺序 为: 类已装入并且是先使用本地类半入器(父类在后) ---相信英文版本也一眼就能看到 - -
行了,was7的现在启动就没问题了。
was7解决方案在IBM官方论坛有
http://www-01.ibm.com/support/docview.wss?mhq=axis2&mhsrc=ibmsearch_s&uid=swg21315686
现在进入更为麻烦的was8布署,环境为was8.5, Axis2仍为1.6.2
先得做完以上was7的操作。
在这里先列举一下我所看到的相关资料的解决方法
方案1 (最终结论非必须):
DisableIBMJAXWSEngine: true in the META-INF/MANIFEST.MF
方案2(与1应该是相同作用,最终结论非必须):
应用服务器--》yourserver-->java和进程管理 下的 进程定义--->其他属性下的 java虚拟机-->其他属性下的定制属性,
如果没有该属性,则新建之。
com.ibmcom.ibm.websphere.webservices.DisableIBMJAXWSEngine 为 true
方案3(我的应用没有,这个不知道):
删除了项目中的,如果有的话 webserviceclient.jar 和 aopalliance-1.0.jar
方案4(最终结论非必须):
将应用axis2.xml中的EnableChildFirstClassLoading 参数设为true
方案5 (好像也不是必须)
在安装war包的第一步操作里,把部署Web Service这个选项勾上。个人猜测这是was自己用来禁用自带webservice服务的选项,可能在一定程度上可以解决冲突。
方案6:最重要的一点
共享库解决方案。
冲突的jar包为axis2-adb-1.6.2.jar,把它放进共享库后,应用中的axis2-adb-1.6.2.jar也没必要删除,可删可不删。
建共享库时有很多细节需要注意,包不要放多了,也不能放少了,建完共享库后还要重启server生效,不止是应用,服务也是得重启的,节点倒是不用操作,这点非常重要!
下面开始建共享库以及引用共享库。
打开菜单环境 - 共享库 , 选好server作用域,如果是集群的话选集群配置,然后点新建菜单
接下来建立你的共享库,冲突的jar只有一个,axis2-adb-1.6.2.jar,注意选类加载隔离
然后很重要的一点要重启Server
菜单在服务器-服务器类型-
选中你应用部署的Server重启,让共享库生效。
然后进应用绑定共享库
绑定完后,后退就可以看到引用到共享库了。至此结束。
这时候启动应用,就正常了。
WAS运行时的类加载顺序,可以去下面这个菜单看看
企业应用程序 >你的应用_war > 管理模块 > 你的应用.war > 查看类装入器(选择服务器) > 类装入器查看器
可以导出文件看下
至此所有问题解决。
现在就只剩一个问题,是如何知道导致冲突的是axis2-adb-1.6.2.jar