Weblogic部署WAR包遇Spring方法不存在异常,Tomcat/JBoss正常
clearMetadataCache()V异常 问题分析
你遇到的org.springframework.beans.factory.config.ConfigurableListableBeanFactory.clearMetadataCache()V异常,本质是Weblogic自带的老旧Spring类与你的应用使用的新版本Spring类发生了类加载冲突。
这个方法是Spring 5.x及以后版本新增的,而Weblogic(尤其是12c之前的版本)通常会自带较低版本的Spring库,部署时Weblogic的类加载器会优先加载服务器自带的类,导致应用中调用新版本Spring的方法时找不到对应实现。而Tomcat和JBoss没有这个问题,是因为Tomcat默认不内置Spring类,JBoss的类加载策略更倾向于优先使用应用打包的依赖,或者其内置的Spring版本刚好兼容你的应用。
解决方案步骤
1. 强制Weblogic优先加载应用内的Spring类
在你的WAR包的WEB-INF目录下创建或修改weblogic.xml,添加<prefer-application-packages>配置,告诉Weblogic优先加载应用打包的Spring相关类:
<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="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"> <!-- 优先加载应用内的Spring类 --> <container-descriptor> <prefer-application-packages> <package-name>org.springframework.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>
2. 统一锁定Spring依赖版本
在你的POM.xml中使用<dependencyManagement>统一管理所有Spring相关依赖的版本,避免传递依赖引入不一致的版本:
<dependencyManagement> <dependencies> <!-- 锁定Spring核心版本,替换成你实际使用的版本 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.20</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.20</version> </dependency> <!-- 其他Spring模块(context、web等)也统一锁定版本 --> </dependencies> </dependencyManagement>
3. 彻底排查依赖冲突
使用Maven命令输出完整的依赖树,检查是否有低版本的Spring依赖被间接引入:
mvn dependency:tree
如果发现有低版本的Spring依赖,在对应的依赖中添加<exclusions>排除掉:
<dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <!-- 其他需要排除的Spring模块 --> </exclusions> </dependency>
4. 清理并重新打包
执行Maven清理命令,确保没有旧的依赖残留:
mvn clean package
然后重新将新生成的WAR包部署到Weblogic。
额外验证
你可以检查Weblogic安装目录下的$WEBLOGIC_HOME/modules文件夹,找到类似org.springframework.beans_*.jar的文件,查看其版本号,确认它确实低于你应用使用的Spring版本,这也能印证我们的冲突猜想。
内容的提问来源于stack exchange,提问作者keshav




