情景
项目在tomcat运行正常,但是部署到weblogic总会报出ClassCastException, NoSuchFieldError, NoSuchMethodError…等等异常。
分析:
此类异常,大多可以归结为类库冲突导致。即weblogic类库已经包含了项目依赖的类库,程序运行时,同个模块的一些类从项目类库中加载,一些类从weblogic类库中加载,两者的类库有差异,当涉及到类型转换,或者方法调用等等逻辑就导致了异常。
解决办法
为了避免上述类冲突情况,weblogic提供了一个机制,允许优先加载项目的类库。
在项目 WEB-INF目录新建 weblogic.xml文件,填写冲突的类包名:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<container-descriptor>
<!-- 优先加载 web-inf 中部分类 -->
<prefer-application-packages>
<package-name>javax.persistence</package-name>
<package-name>org.hibernate.jpa.internal</package-name>
<package-name>org.slf4j</package-name>
<package-name>javassist</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>