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

WebLogic 14c部署OSGI应用时遭遇ClassNotFoundException求助

问题排查与解决方案

核心原因分析

org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer 是Jersey Servlet模块的核心初始化类,找不到该类通常和类加载优先级、OSGI包可见性、WebLogic自带Jersey的冲突直接相关,结合你不使用provided scope的配置,重点排查以下几个方向:

1. 解决WebLogic 14c自带Jersey的版本冲突

WebLogic 14c默认集成了Jersey 2.x版本,当项目打包自有Jersey依赖时,容器类加载器可能优先加载自带版本,导致项目打包的类无法被识别。需在weblogic.xml中明确配置类加载优先级,让Web应用优先加载自身打包的依赖:

<weblogic-web-app>
  <container-descriptor>
    <!-- 全局优先加载WEB-INF/lib下的类,若担心兼容性可改用下方精细配置 -->
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
    <!-- 精准控制:仅优先加载Jersey相关包,避免影响其他容器服务 -->
    <prefer-application-packages>
      <package-name>org.glassfish.jersey.*</package-name>
      <package-name>javax.ws.rs.*</package-name>
    </prefer-application-packages>
  </container-descriptor>
</weblogic-web-app>

2. 确认项目打包包含完整Jersey Servlet依赖

不使用provided scope时,必须确保WebApp POM中引入了Jersey Servlet核心模块,且依赖传递完整:

<dependencies>
  <!-- Jersey Servlet核心依赖 -->
  <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>你的Jersey版本号</version>
  </dependency>
  <!-- JAX-RS API依赖(版本需与Jersey兼容) -->
  <dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1.1</version>
  </dependency>
</dependencies>

执行mvn dependency:tree检查依赖树,确认jersey-container-servlet及其关联的jersey-server、jersey-common等包都被打包到WEB-INF/lib目录下。

3. 修正OSGI环境下的包导入/导出配置

作为OSGI Web应用,需保证MANIFEST.MF正确配置Jersey相关包的导入规则。若使用Maven Bundle插件,在父POM或WebApp POM中添加:

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <version>4.2.1</version>
  <configuration>
    <instructions>
      <Import-Package>
        org.glassfish.jersey.servlet.init,
        org.glassfish.jersey.*,
        javax.ws.rs.*,
        *
      </Import-Package>
      <Export-Package>
        com.yourproject.*,
        !org.glassfish.jersey.* <!-- 避免重复导出容器自带包 -->
      </Export-Package>
    </instructions>
  </configuration>
</plugin>

同时确认WebLogic 14c的OSGI容器已识别WEB-INF/lib下的JAR包为合法bundle,或单独部署Jersey依赖为OSGI bundle。

4. 检查web.xml中的Jersey配置正确性

确保web.xml未引用容器自带的Jersey类,改用项目打包的标准Servlet配置:

<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>com.yourproject.rest</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

5. 开启类加载日志定位问题

开启WebLogic类加载调试日志,追踪该类的加载路径:

  • 进入WebLogic控制台的服务器 -> 日志 -> 高级
  • 开启调试级别日志,添加weblogic.classloader的调试项
  • 重新部署应用,查看日志中org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer的加载尝试路径,确认是否从项目WEB-INF/lib加载

内容的提问来源于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 18:05:32