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>
关键说明
-
触发时机:绑定
package阶段,执行mvn clean package时,会自动复制依赖到target/lib; -
依赖范围:
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>
关键说明
- 核心:
addClasspath=true+classpathPrefix=lib/组合,会在清单文件中自动生成所有依赖的路径(如lib/spring-boot-3.5.11.jar),JVM 启动时会自动扫描这些路径加载依赖; - 必改项:
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>
关键说明(避坑重点)
- 版本必须一致:插件版本必须与你的 Spring Boot 项目版本一致,避免出现配置不兼容、打包失败的问题;
如果引入了spring-boot-starter-parent可以不填写版本号,会自动识别。 - 瘦身核心:
<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>
<!-- 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 部署与启动
-
将
target下的Jar包和lib目录复制到同一部署目录(必须同级); -
无需添加任何启动参数,直接执行启动命令:
bash
java -jar your-project-0.0.1-SNAPSHOT.jar
五、常见问题排查
- Jar 体积未变小:检查
spring-boot-maven-plugin的<includes>配置,确保groupId和artifactId与项目自身一致,且未添加多余的include; - 启动报「找不到主类」:检查
maven-jar-plugin的<mainClass>,确保是启动类的全路径(无拼写错误、无包名遗漏); - 启动报「类找不到」:检查 Jar 包和
lib目录是否同级,且lib目录包含所有运行时依赖(重新执行打包命令即可); - 打包报错:检查插件的版本是否与 Spring Boot 兼容。