WebLogic14c部署OSGi应用遭遇ClassCastException问题求助
问题原因分析
这个ClassCastException的核心是类加载冲突:
- WebLogic 14c默认集成了Jersey 2.x版本的JAX-RS实现,但你的应用打包了独立的Jersey库(非provided scope),且版本与WebLogic自带的Jersey不兼容(比如应用用Jersey 1.x,或虽为2.x但版本差异较大)。
- WebLogic的
weblogic.jaxrs.server.media.multipart.Jersey1MultiPartSupport是为兼容Jersey 1.x设计的类,它被错误加载后尝试适配Jersey 2.x的org.glassfish.jersey.internal.spi.AutoDiscoverable接口,最终导致类型转换失败。
解决方案
1. 强制WebLogic优先加载应用自身的Jersey类
修改weblogic.xml,添加类加载优先级配置,让容器优先使用应用打包的类而非自带类:
<container-descriptor> <prefer-application-packages> <package-name>org.glassfish.jersey.*</package-name> <package-name>com.sun.jersey.*</package-name> <!-- 若应用使用Jersey 1.x需添加 --> <package-name>javax.ws.rs.*</package-name> </prefer-application-packages> <prefer-application-resources> <resource-name>META-INF/services/*</resource-name> </prefer-application-resources> </container-descriptor>
2. 排除WebLogic自带的冲突模块
在weblogic.xml中直接排除WebLogic的JAX-RS相关模块,避免交叉加载:
<weblogic-web-app> <context-root>你的应用根路径</context-root> <container-descriptor> <prefer-application-packages> <!-- 同上配置 --> </prefer-application-packages> <exclude-packages> <package-name>weblogic.jaxrs.*</package-name> </exclude-packages> </container-descriptor> </weblogic-web-app>
3. 统一Jersey版本并清理依赖
- 检查
pom.xml,确保所有Jersey相关依赖(如jersey-core、jersey-server、jersey-multipart)使用同一版本,且适配Java 8与WebLogic 14c(推荐Jersey 2.35+版本)。 - 移除冗余的Jersey 1.x依赖,避免混合版本:
<dependencies> <!-- 示例:统一使用Jersey 2.x --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.35</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.35</version> </dependency> <!-- 其他JAX-RS/Jersey依赖保持版本一致 --> </dependencies>
4. 调整web.xml的JAX-RS Servlet配置
确保web.xml中使用应用打包的Jersey Servlet,而非WebLogic自带的实现:
<servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的资源类所在包路径</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
验证步骤
- 重新打包应用,确认所有Jersey依赖已正确打包至WAR的
WEB-INF/lib目录。 - 部署到WebLogic 14c,观察是否仍存在类转换异常。
- 开启WebLogic类加载调试日志,确认应用类优先加载。
内容的提问来源于stack exchange,提问作者pietro laforgia
相关产品推荐
相关产品推荐

