Spring Boot 3.3.3升级后spring-boot-maven-plugin未执行求助
将Spring Boot从2.7.14升级到3.3.3后,项目始终通过maven-jar-plugin生成Jar包,而非spring-boot-maven-plugin。生成的Jar包不含BOOT-INF目录,仅包含应用类无依赖,MANIFEST.MF显示由Maven JAR Plugin 3.4.2创建。本地运行正常,但部署到测试环境时抛出异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
已移除pom.xml中maven-jar-plugin的配置,但MANIFEST.MF仍有该插件痕迹,且pom.xml已配置spring-boot-maven-plugin的repackage和build-info执行目标及主类。
1. 确保spring-boot-maven-plugin正确绑定到构建生命周期
maven-jar-plugin是Maven默认插件,会自动绑定到package阶段。要让spring-boot-maven-plugin的repackage目标覆盖默认Jar生成,需确保插件配置正确并绑定到对应阶段。
情况1:继承spring-boot-starter-parent(推荐)
如果项目继承了spring-boot-starter-parent,插件配置可简化为:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> <goal>build-info</goal> </goals> </execution> </executions> <configuration> <mainClass>com.yourpackage.YourApplication</mainClass> </configuration> </plugin> </plugins> </build>
spring-boot-starter-parent已默认将repackage目标绑定到package阶段,无需额外指定phase。
情况2:未继承spring-boot-starter-parent
需手动指定插件的执行阶段和版本:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.3.3</version> <!-- 版本需与Spring Boot版本一致 --> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> <goal>build-info</goal> </goals> </execution> </executions> <configuration> <mainClass>com.yourpackage.YourApplication</mainClass> </configuration> </plugin> </plugins> </build>
2. 排查隐藏的maven-jar-plugin配置
- 检查父
pom.xml或其他模块的pom.xml,确认是否有强制启用maven-jar-plugin的配置,若存在需移除或调整优先级。 - 执行命令查看插件有效配置:
通过输出确认是否有来自继承的mvn help:describe -Dplugin=jar -Ddetailmaven-jar-plugin配置。
3. 清理Maven缓存与构建产物
旧构建缓存可能导致插件痕迹残留,执行以下命令彻底清理后重新构建:
mvn clean install -U
clean:删除target目录下所有构建产物-U:强制更新快照依赖并重新下载插件
4. 验证构建结果
构建完成后,检查target目录下的Jar包:
- 正确的可执行Jar包名称为
xxx-xxx.jar,maven-jar-plugin生成的瘦Jar会被重命名为xxx-xxx.jar.original - 解压Jar包,确认包含
BOOT-INF目录(存放依赖和应用类),且MANIFEST.MF中显示由Spring Boot Maven Plugin创建
- 本地运行正常:通过
mvn spring-boot:run启动时,Maven会自动将所有依赖加入类路径,无需依赖Jar包内的BOOT-INF目录。 - 测试环境报错:部署的是
maven-jar-plugin生成的瘦Jar,仅包含应用类,缺少Spring Boot核心依赖,因此抛出NoClassDefFoundError。
内容的提问来源于stack exchange,提问作者enryu

