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

