You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
验证步骤
  1. 重新打包应用,确认所有Jersey依赖已正确打包至WAR的WEB-INF/lib目录。
  2. 部署到WebLogic 14c,观察是否仍存在类转换异常。
  3. 开启WebLogic类加载调试日志,确认应用类优先加载。

内容的提问来源于stack exchange,提问作者pietro laforgia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:35:20