Spring Boot 3.5.11 分离打包(无参数启动+Jar瘦身)完整配置文档

Spring Boot 3.5.11 分离打包(无参数启动+Jar瘦身)完整配置文档

一、配置核心目标

本文配置专为 Spring Boot 3.5.11 版本设计,核心实现 3 个核心需求,彻底解决打包体积大、启动需额外参数、依赖与代码分离的问题:

  • 依赖与业务代码分离:依赖单独打包到 lib 目录,后续更新仅替换业务Jar,无需重新部署依赖
  • 无参数启动:无需添加 -Dloader.path=./lib,JVM 自动加载与Jar同级的 lib 目录依赖
  • Jar 瘦身:仅打包自身业务代码,Jar 体积压缩至几KB~几MB,大幅提升打包和部署效率

二、配置拆解(分插件详解)

整个配置由 3 个核心 Maven 插件组成,各司其职、协同工作,以下逐一步拆解每一步的作用和核心配置项。

2.1 插件一:maven-dependency-plugin(依赖复制插件)

核心作用

将项目所有 运行时依赖 复制到指定的 lib 目录,实现依赖与业务代码的物理分离,是分离打包的基础。

核心配置项详解

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.6.1</version>
    <executions>
        <execution>
            <id>copy-dependencies</id> <!-- 执行任务的唯一标识,可自定义 -->
            <phase>package</phase> <!-- 绑定到打包阶段,执行package时自动触发 -->
            <goals>
                <goal>copy-dependencies</goal> <!-- 核心目标:复制依赖 -->
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <!-- 依赖输出目录:打包后在target目录下生成lib文件夹,存放所有依赖 -->
                <includeScope>runtime</includeScope>
                <!-- 仅复制运行时依赖(排除编译时、测试时依赖),减少lib目录体积 -->
            </configuration>
        </execution>
    </executions>
</plugin>

关键说明

  1. 触发时机:绑定 package 阶段,执行 mvn clean package 时,会自动复制依赖到 target/lib

  2. 依赖范围:includeScope=runtime 仅保留项目运行时必需的依赖,避免冗余(如测试依赖不会被复制)。

2.2 插件二:maven-jar-plugin(Jar包清单配置插件)

核心作用

配置 Jar 包的 MANIFEST.MF 清单文件,核心实现「无参数启动」------ 让 JVM 自动识别并加载与 Jar 同级的 lib 目录依赖,无需手动指定依赖路径。

核心配置项详解

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.4.1</version>
    <configuration>
        <archive>
            <!-- 配置Jar包的MANIFEST.MF清单文件 -->
            <manifest>
                <addClasspath>true</addClasspath>
                <!-- 自动生成Class-Path属性,指定依赖路径 -->
                <classpathPrefix>lib/</classpathPrefix>
                <!-- 依赖路径前缀:所有依赖都在lib目录下,自动拼接路径 -->
                <mainClass>com.xxx.YourApplication</mainClass>
                <!-- 项目启动类全路径(必须修改为自己的启动类) -->
            </manifest>
        </archive>
    </configuration>
</plugin>

关键说明

  1. 核心:addClasspath=true + classpathPrefix=lib/ 组合,会在清单文件中自动生成所有依赖的路径(如 lib/spring-boot-3.5.11.jar),JVM 启动时会自动扫描这些路径加载依赖;
  2. 必改项:mainClass 必须替换为你项目的启动类全路径(例如 com.soccer.SoccerDataProviderApplication),否则启动会报「找不到主类」错误;

2.3 插件三:spring-boot-maven-plugin(Spring Boot 核心打包插件)

核心作用

Spring Boot 项目专属打包插件,核心实现「Jar 瘦身」------ 仅打包项目自身的业务代码,排除所有第三方依赖,确保 Jar 体积最小化。

核心配置项详解

xml 复制代码
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>3.5.11</version> <!-- 与项目Spring Boot版本一致,避免冲突 -->
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal> <!-- 核心目标:重新打包,生成可执行Jar -->
            </goals>
        </execution>
    </executions>
    <configuration>
        <includes>
            <include>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.artifactId}</artifactId>
            </include>
        </includes>
        <!-- 核心瘦身配置:仅打包自身项目代码(groupId和artifactId与项目一致) -->
    </configuration>
</plugin>

关键说明(避坑重点)

  1. 版本必须一致:插件版本必须与你的 Spring Boot 项目版本一致,避免出现配置不兼容、打包失败的问题;
    如果引入了spring-boot-starter-parent可以不填写版本号,会自动识别。
  2. 瘦身核心:<includes> 配置指定「仅打包项目自身的代码」(${project.groupId}${project.artifactId} 是项目自身的坐标,自动匹配,无需手动修改),自动排除所有第三方依赖;

三、完整可复制配置(直接替换pom.xml的build节点)

注意:仅需修改 <mainClass> 为你项目的启动类全路径,其余配置无需修改,直接复制使用。

xml 复制代码
<build>
    <plugins>
        <!-- 1. 复制运行时依赖到 target/lib 目录(分离依赖核心) -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.6.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <includeScope>runtime</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin&gt;

        <!-- 2. 配置Jar清单,实现无参数启动(自动加载同级lib) -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.4.1</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- ########## 必改 ########## -->
                        <mainClass>com.xxx.YourApplication</mainClass>
                       <!-- 替换为你的项目启动类全路径,例如:com.soccer.SoccerDataProviderApplication -->
                        <!-- ########################### -->
                    </manifest>
                </archive>
            </configuration>
        </plugin>

       <!-- 3. Spring Boot 核心打包插件(Jar瘦身,仅打包业务代码) -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>3.5.11</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <includes>
                    <include>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                    </include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

四、打包与启动流程(验证配置有效性)

4.1 打包命令

执行以下命令,快速打包(跳过测试,提升打包速度):

bash 复制代码
mvn clean package -DskipTests

4.2 打包后目录结构

打包完成后,在 target 目录下会生成以下内容(符合预期即为配置生效):

Plain 复制代码
target/
├── your-project-0.0.1-SNAPSHOT.jar  # 业务Jar(仅几KB~几MB,瘦身成功)
└── lib/                             # 依赖目录(存放所有第三方依赖,首次部署后无需变动)

4.3 部署与启动

  1. target 下的 Jar包lib目录 复制到同一部署目录(必须同级);

  2. 无需添加任何启动参数,直接执行启动命令:

bash 复制代码
java -jar your-project-0.0.1-SNAPSHOT.jar

五、常见问题排查

  • Jar 体积未变小:检查 spring-boot-maven-plugin<includes> 配置,确保 groupIdartifactId 与项目自身一致,且未添加多余的 include
  • 启动报「找不到主类」:检查 maven-jar-plugin<mainClass>,确保是启动类的全路径(无拼写错误、无包名遗漏);
  • 启动报「类找不到」:检查 Jar 包和lib 目录是否同级,且 lib 目录包含所有运行时依赖(重新执行打包命令即可);
  • 打包报错:检查插件的版本是否与 Spring Boot 兼容。
相关推荐
echome8882 小时前
Go 语言并发编程:Channel 与 Goroutine 的完美结合
开发语言·后端·golang
weixin_408099672 小时前
身份证正反面合并+识别OCR接口调用
java·人工智能·后端·python·ocr·api·身份证ocr
流觞 无依2 小时前
Linux下SQLite数据库空间管理 查看表占用空间+清理优化
java·jvm·oracle
橘子编程2 小时前
Django全栈开发终极指南
后端·python·django·npm·html·pandas·html5
Java成神之路-2 小时前
Spring 注解开发进阶实战:Bean 生命周期、 依赖注入及Properties配置(Spring系列4)
java·后端·spring
牛奔2 小时前
升级Go 版本,导致兼容性依赖编译错误排查并解决
开发语言·后端·golang
小邓的技术笔记2 小时前
聊聊 ASP.NET Core 中间件和过滤器的区别
后端·中间件·asp.net
运维行者_2 小时前
网络监控告警设置指南:如何配置智能告警规避“告警风暴”?
linux·运维·服务器·网络·后端
知识汲取者2 小时前
初识 RuoYi-Vue
java·spring boot·后端·开源软件