项目用到了一个第三方打包的jar包,里面的结构如下:
可以看到用到了一些apache
的东西。我在开发环境tomcat下能正常运行,部署到正式环境weblogic 10.3.0
下就报异常了,找不到方法或者找不到类。那么极有可能是jar包冲突了,于是我到weblogic下的domain/lib/
中,果然发现有重复的axis2
,axiom
包
并且版本较旧,所以找不到方法。
一通百度后,试验了以下几个方法:
- 将第三方包放到
domain/lib
下 结果:错误,无法引用到正确的类 在web-inf下加
weblogic.xml
,然后添加以下配置<container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor>
结果:错误,因为优先加载web-inf下的包,导致weblogic所要调用的包都从web-inf下加载,应用无法启动。
在
weblogic.xml
下加以下<container-descriptor> <prefer-application-packages> <package-name>org.apache.axis2.*</package-name> <package-name>org.apache.axiom.*</package-name> </prefer-application-packages> </container-descriptor>
结果:错误,无法解析prefer-application-packages这个tag,报xmln错误。
- 删掉weblogic中所有冲突的包,就只使用web-inf/lib下的第三方包 结果:错误,类的引用还是有问题,而且weblogic中其他项目会受影响
最后,再经过一番谷歌,终于在oracle的社区中找到了解决方法……
在项目.ear/META-INF
中创建一个weblogic-application.xml
,写下如下配置:
<?xml version="1.0"?>
<weblogic-application>
<prefer-application-packages>
<package-name>org.apache.axis2.*</package-name>
<package-name>org.apache.axiom.*</package-name>
</prefer-application-packages>
</weblogic-application>
最主要的原因是,weblogic 10.3.3 以下
的版本,只能在domain/applications/META-INF/weblogic-application.xml
配置类的加载路径是以web-inf/lib下的包为优先的,在weblogic 10.3.3 以上
的版本,则可以在domain/applications/APP.ear/APP.war/web-inf/weblogic.xml
中进行配置,也就是我上面尝试的第三个方法。
参考链接:Oracle社区