添加Spring Security依赖后出现NoSuchMethodError运行时错误求助
这明显是Spring版本依赖冲突引发的问题,我帮你拆解原因和解决步骤:
问题根源
你在pom.xml中指定了Spring核心版本为5.0.4.RELEASE,但引入Spring Security(比如spring-security-core)时,它默认依赖了5.0.5.RELEASE版本的Spring组件。这就导致项目运行时,类路径中同时存在不同版本的Spring核心类——AnnotationUtils.clearCache()方法是Spring 5.0.5新增的,而实际加载的是5.0.4版本的AnnotationUtils,自然找不到这个方法,触发NoSuchMethodError。
解决方案
1. 统一Spring版本管理
在pom.xml中通过<properties>统一声明Spring版本,让所有Spring相关依赖都继承这个版本,从根源避免版本不一致:
<properties> <spring.version>5.0.4.RELEASE</spring.version> </properties>
之后所有Spring和Spring Security的依赖都不要单独指定版本,或者用${spring.version}引用这个变量,比如:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring.version}</version> </dependency>
2. 强制覆盖冲突依赖版本
如果上面的方式没生效,可通过<dependencyManagement>显式指定Spring核心组件的版本,强制Maven优先使用你指定的版本:
<dependencyManagement> <dependencies> <!-- 强制所有Spring核心组件使用5.0.4.RELEASE --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- 其他用到的Spring核心组件都可以在这里统一声明 --> </dependencies> </dependencyManagement>
3. 排除特定依赖的冲突组件
如果执行mvn dependency:tree后,发现仍有spring-security-core引入的5.0.5版本Spring组件,可以在spring-security-core的依赖中添加排除规则:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>你的Spring Security版本</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <!-- 排除其他冲突的Spring组件 --> </exclusions> </dependency>
4. 验证依赖一致性
修改后再次执行mvn dependency:tree,检查所有Spring组件的版本是否统一为5.0.4.RELEASE,确保没有混合版本的情况。
额外建议
Spring Security和Spring核心版本存在严格的兼容性对应关系,建议尽量使用匹配的版本组合(比如Spring 5.0.x对应Spring Security 5.0.x),避免跨版本混用引发其他潜在问题。
内容的提问来源于stack exchange,提问作者Kingamere




