📦 创建可执行 JAR 文件
🔹 概述
在完成示例的最后环节,我们将创建一个完全自包含的可执行 jar 文件,该文件可直接在生产环境运行。可执行 jar(又称 uber jar 或 fat jar)是一种包含编译后类文件及全部运行时依赖包的归档文件。
🌐 可执行 JAR 与 Java 的兼容性
❗ 问题
Java 原生不支持加载嵌套 jar 文件(即包含在 jar 内的其他 jar 文件),这一特性在分发独立应用程序时会造成不便。
🔄 解决方案对比
🔸 传统方案:uber jar
将所有依赖库的类文件打包进单一归档,但存在以下缺陷:
1️⃣ 难以识别应用程序实际使用的库文件
2️⃣ 当不同 jar 中包含同名文件时会产生冲突
🔹 Spring Boot 方案
采用创新方案,支持原生嵌套 jar 文件结构。
🏗 Maven 构建方式
1️⃣ 配置插件
在 pom.xml 文件的 dependencies 章节之后添加 spring-boot-maven-plugin 插件配置:
xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
⚠ 注意
使用 spring-boot-starter-parent 作为父 POM 时会自动配置 repackage 目标,否则需手动声明(详见插件文档)。
2️⃣ 执行打包命令
在命令行运行打包指令:
bash
$ mvn package
📌 输出示例
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO] BUILD SUCCESS
3️⃣ 检查生成文件
• 🏷 主文件 :18MB 左右的 myproject-0.0.1-SNAPSHOT.jar
• ⏮ 原始文件 :体积较小的 myproject-0.0.1-SNAPSHOT.jar.original(Spring Boot 重打包前的初始文件)
4️⃣ 运行应用
bash
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
🖥 控制台将显示 Spring Boot 启动日志,按 ctrl-c 可退出应用。
📦 Gradle 构建方式
1️⃣ 执行构建命令
bash
$ gradle bootJar
📌 输出示例
BUILD SUCCESSFUL in 639ms
2️⃣ 检查生成文件
在 build/libs 目录可找到约 18MB 的 jar 文件,使用以下命令查看内容:
bash
$ jar tvf build/libs/myproject-0.0.1-SNAPSHOT.jar
3️⃣ 运行应用
bash
$ java -jar build/libs/myproject-0.0.1-SNAPSHOT.jar
🔄 运行效果与 Maven 版本一致,通过 ctrl-c 终止应用。
📚 [术语对照]
• 🏷 uber jar - 超级归档包
• 📦 fat jar - 胖归档包
• 🔄 nested jar - 嵌套式归档包
• ⚙ repackage goal - 重新打包目标
• 📂 build/libs directory - 构建/库目录