使用CommandLineRunner的Spring Boot项目Maven打包时直接启动不生成jar如何解决
解决方案
原因说明
该问题本质是Maven执行打包生命周期的过程中触发了Spring应用上下文初始化,CommandLineRunner的实现逻辑会在上下文初始化完成后自动执行,看起来就像打包时直接启动了应用,通常是插件执行目标配置不正确、或测试阶段触发应用启动导致的。
具体修复方案
方案1:修正spring-boot-maven-plugin配置,显式指定repackage执行目标
修改pom.xml插件配置如下:<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.0</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <!-- 可选:有多个启动类时可通过以下配置指定主类 --> <configuration> <mainClass>你的项目主类全限定名</mainClass> </configuration> </plugin> </plugins>该配置会明确让插件在package阶段执行repackage动作生成可执行jar包,不会额外触发应用启动。
方案2:打包时跳过测试执行
如果是测试阶段的@SpringBootTest注解加载上下文导致CommandLineRunner执行,可以在打包命令上加参数跳过测试:.\mvnw clean package -DskipTests或者
.\mvnw clean install -Dmaven.test.skip=true方案3:针对CommandLineRunner调整测试逻辑(不想跳过测试时使用)
给你的CommandLineRunner实现类加上@ConditionalOnProperty注解,让它仅在指定配置开启时才加载,避免测试阶段自动执行:@Component @ConditionalOnProperty(prefix = "app.runner", name = "enabled", havingValue = "true", matchIfMissing = true) public class 你的Runner实现类 implements CommandLineRunner { // 原有逻辑 }然后在测试配置文件
application-test.properties中添加配置:app.runner.enabled=false
如果以上方案仍未解决,检查pom.xml中是否存在将spring-boot:run目标绑定到package、install生命周期阶段的配置,如有请删除相关绑定配置。
验证方式
执行打包命令后,到项目的target目录下查看,会生成两个jar文件:
- 后缀为
.original的是普通jar包,仅包含项目代码编译结果 - 没有original后缀的是Spring Boot可执行jar包,可直接通过
java -jar xxx.jar命令启动
内容的提问来源于stack exchange,提问作者lewis machilika
相关产品推荐
相关产品推荐

