本文对 Spring Boot 服务应用的打包机制进行一个基础的介绍与说明,包括以下内容:
- Spring Boot 默认是如何完成打包的
- 可执行 Jar 的内部结构是什么
- 打包过程中各 Maven 插件的职责边界
- 生产环境中推荐的基础打包规范
一、默认打包方式
1.1 默认构建工具
在 Maven 体系下,主要依赖 spring-boot-maven-plugin 实现打包功能。
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
该插件负责将普通 Java Jar 重新打包(repackage) 为可直接运行的 Jar。
1.2 标准构建命令
bash
mvn clean package
构建完成后,在模块的 target/ 目录下生成打包产物。
二、打包结果说明
2.1 target 目录结构
text
target/
├─ xxx.jar
├─ xxx.jar.original
└─ classes/
- xxx.jar :最终部署使用的可执行 Jar
- xxx.jar.original :未 repackage 前的原始 Jar,一般无需使用
- classes/ :编译后的 class 与资源文件
2.2 可执行 Jar(Fat Jar)
Spring Boot 默认生成的是 Fat Jar,本质上是一个压缩包,内置了所有依赖,不依赖外部 lib 目录。也就是说只需 JDK 就可以运行完整服务。
三、Jar包 结构分析
典型 Spring Boot Jar 结构如下:
text
xxx.jar
├─ BOOT-INF/
│ ├─ classes/ # 应用代码与配置文件
│ └─ lib/ # 所有依赖 Jar
├─ META-INF/
└─ org/springframework/boot/loader
- BOOT-INF/classes
- 业务代码
- application.yml / properties
- 静态资源
- BOOT-INF/lib
- Maven 依赖的所有三方 Jar
- boot loader
- Spring Boot 自定义类加载器-也就是编译后的class文件
四、Spring Boot Jar 的运行方式
4.1 标准启动命令
bash
java -jar xxx.jar
4.2 常见运行参数
bash
java -jar xxx.jar \
--spring.profiles.active=prod \
--server.port=8080
五、Jar 命名与版本管理建议
5.1 默认命名
text
service-order-1.0.0-SNAPSHOT.jar
6.2 自定义名称
可以在 pom.xml 中指定:
xml
<build>
<finalName>${project.artifactId}</finalName> # ${project.artifactId} 单独定义
</build>
打包生成:
text
指定名称.jar
六、pom.xml 配置示例
xml
<build>
<!-- 生成的 jar 文件名稳定,不带版本号 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Spring Boot 打包插件,生成可执行 Fat Jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
</plugin>
</plugins>
</build>
配置说明
- finalName:控制生成的 Jar 名称
- spring-boot-maven-plugin:将普通 Jar 打包为可执行 Fat Jar