Weblogic 12c部署升级Jersey 2.5.1的Web应用遇库引用异常求助
解决Weblogic 12c部署Jersey 2.5.1应用时的Unresolved Webapp Library引用问题
从你提供的报错信息来看,核心问题是Weblogic无法找到匹配的JAX-RS 2.0库引用,导致部署失败:
return (<Dec 9, 2019 7:35:17,517 AM GMT> <Error> <Deployer> <WL-149205> <Failed to initialize the application "CDMWebWar" due to error weblogic.application.ModuleException: Error: Unresolved Webapp Library references for "WebAppModule(CDMWebWar:CDMWeb.war)", defined in weblogic.xml [Extension-Name: jax-rs, Specification-Version: 2, exact-match: false]> )
这是因为Weblogic 12c默认自带了JAX-RS 1.x的实现(基于Jersey 1.x),而你的应用升级到了Jersey 2.5.1(对应JAX-RS 2.0规范),两者版本不兼容,导致Weblogic试图加载自带的旧版本库,却找不到符合JAX-RS 2.0规范的库。下面是几个亲测有效的解决方法:
方法1:禁用Weblogic自带的JAX-RS库,优先加载应用内的包
在你的weblogic.xml中添加prefer-application-packages配置,告诉Weblogic优先使用应用打包的Jersey相关类,而不是服务器自带的:
<weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd"> <!-- 保留你原有的其他配置,比如context-root等 --> <wls:prefer-application-packages> <!-- JAX-RS API包 --> <wls:package-name>javax.ws.rs.*</wls:package-name> <!-- Jersey 2.x核心包 --> <wls:package-name>org.glassfish.jersey.*</wls:package-name> <!-- Jersey依赖的HK2容器包 --> <wls:package-name>org.glassfish.hk2.*</wls:package-name> <wls:package-name>org.jvnet.hk2.*</wls:package-name> <!-- Jersey媒体相关包 --> <wls:package-name>org.glassfish.jersey.media.*</wls:package-name> <!-- 兼容可能存在的旧Jersey包(如果有的话) --> <wls:package-name>com.sun.jersey.*</wls:package-name> <wls:package-name>jersey.repackaged.*</wls:package-name> </wls:prefer-application-packages> </weblogic-web-app>
方法2:移除或调整weblogic.xml中的JAX-RS库引用
如果你的weblogic.xml里配置了如下的库引用:
<library-ref> <extension-name>jax-rs</extension-name> <specification-version>2</specification-version> <exact-match>false</exact-match> </library-ref>
要么直接删除这段配置(让应用使用自身打包的Jersey库),要么确保Weblogic服务器上已经部署了符合JAX-RS 2.0规范的库(比如Oracle提供的JAX-RS 2.0扩展库,但这个需要单独下载部署,不如直接用应用自带的方便)。
方法3:确认应用依赖配置正确(Maven/Gradle)
如果用Maven管理依赖,确保Jersey相关依赖是compile范围(默认就是),这样会把依赖打包到WAR的WEB-INF/lib目录下:
<dependencies> <!-- Jersey核心Servlet容器依赖 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.5.1</version> </dependency> <!-- 如果你用了Jersey的其他模块,比如JSON支持,也要加上 --> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.5.1</version> </dependency> </dependencies>
注意不要把Jersey依赖设为provided,否则不会打包到WAR里,Weblogic还是会找自带的旧版本。
方法4:清理Weblogic缓存并重启服务器
有时候Weblogic的临时缓存会导致旧的库文件残留,清理后重启能解决奇怪的问题:
- 停止Weblogic服务器
- 删除域目录下的
tmp和cache文件夹(比如your_domain/tmp、your_domain/cache) - 重新启动服务器,再部署应用
额外注意点
- Weblogic 12.1.3及以上版本开始原生支持JAX-RS 2.0,但即使如此,还是建议配置
prefer-application-packages来避免版本冲突 - 检查WAR包的
WEB-INF/lib目录,确保所有Jersey 2.5.1相关的jar包都存在,没有遗漏
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

