You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:57:03