You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Weblogic部署WAR包遇Spring方法不存在异常,Tomcat/JBoss正常

解决Weblogic部署Spring应用时的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

火山引擎 最新活动