Spring Boot 2.2.0与Maven插件兼容问题求助
这是典型的Spring Boot快照版本依赖不兼容问题,我来帮你拆解原因和解决方案:
问题背景回顾
你有两个Spring Boot项目:
项目1基于
spring-boot-starter-parent2.0.3.RELEASE,运行正常,本地Maven仓库存在spring-plugin-core:2.0.0.BUILD-SNAPSHOT项目2基于
spring-boot-starter-parent2.2.0.BUILD-SNAPSHOT,启动时报错:尝试调用方法org.springframework.plugin.core.PluginRegistry.getPluginFor(Ljava/lang/Object;Lorg/springframework/plugin/core/Plugin;)Lorg/springframework/plugin/core/Plugin;,但该方法不存在。
其类org.springframework.plugin.core.PluginRegistry可从以下位置获取:
jar:file:/.../.m2/repository/org/springframework/plugin/spring-plugin-core/2.0.0.BUILD-SNAPSHOT/spring-plugin-core-2.0.0.BUILD-SNAPSHOT.jar!/org/springframework/plugin/core/PluginRegistry.class
加载路径为:
file:/.../.m2/repository/org/springframework/plugin/spring-plugin-core/2.0.0.BUILD-SNAPSHOT/spring-plugin-core-2.0.0.BUILD-SNAPSHOT.jar强制指定
spring-boot-maven-plugin版本时会收到覆盖管理版本的警告,且项目昨日还能正常运行,降级到2.0.3.RELEASE后恢复正常。
核心原因分析
依赖版本不匹配
Spring Boot 2.2.x系列对spring-plugin-core的版本要求和2.0.x完全不同,2.2.0.BUILD-SNAPSHOT需要更高版本的spring-plugin-core(比如2.1.x快照版),但你的本地仓库仍在使用旧的2.0.0快照版,旧版本类中没有新版本Spring Boot调用的那个方法,导致反射调用失败。SNAPSHOT版本的不稳定性
BUILD-SNAPSHOT是Spring Boot开发中的迭代版本,官方会随时更新其依赖配置。你昨天能正常运行,说明当时这个快照版本依赖的还是兼容的spring-plugin-core版本,今天官方更新了快照的依赖清单,但你的Maven没有自动拉取最新的快照依赖,导致本地缓存的旧依赖失效。Maven插件版本的误解
你提到"Maven插件并无2.2.0版本",其实spring-boot-maven-plugin:2.2.0.BUILD-SNAPSHOT是存在的(属于快照版本),警告只是提示你覆盖了父POM管理的版本,核心问题不在插件本身,而在依赖的spring-plugin-core。
解决方案
方案1:强制刷新快照依赖
在项目2的根目录执行以下Maven命令,强制更新所有快照依赖:
mvn clean install -U
-U参数会让Maven忽略本地缓存,重新拉取Spring Boot 2.2.0.BUILD-SNAPSHOT对应的最新spring-plugin-core版本,替换本地旧的2.0.0快照包。
方案2:显式指定兼容的spring-plugin-core版本
如果刷新快照后仍有问题,可以在项目2的pom.xml中显式添加spring-plugin-core依赖,指定Spring Boot 2.2.x快照对应的版本(比如当时官方适配的2.1.0.BUILD-SNAPSHOT):
<dependencies> <dependency> <groupId>org.springframework.plugin</groupId> <artifactId>spring-plugin-core</artifactId> <version>2.1.0.BUILD-SNAPSHOT</version> </dependency> </dependencies>
这会强制Maven使用兼容的版本,避免依赖冲突。
方案3:改用稳定版Spring Boot
快照版本本身就是用于测试的不稳定版本,建议改用同系列的正式稳定版(比如2.2.0.RELEASE,如果已经发布),或者切换到2.1.x的长期支持稳定版,这样依赖版本更可靠,不会出现快照迭代导致的突发问题。
内容的提问来源于stack exchange,提问作者Magno C

