创建可执行 JAR 文件

📦 创建可执行 JAR 文件

🔹 概述

在完成示例的最后环节,我们将创建一个完全自包含的可执行 jar 文件,该文件可直接在生产环境运行。可执行 jar(又称 uber jarfat 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 - 构建/库目录

相关推荐
似水流年,是谁苍白了等待2 小时前
Spring Boot + MyBatis plus + MySQL 实现位置直线距离实时计算
spring boot·mysql·mybatis
老华带你飞4 小时前
学生信息管理系统|基于Springboot的学生信息管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·学生信息管理系统
FrankYoou5 小时前
Spring Boot 自动配置之 Spring transaction
java·spring boot·spring
卷Java5 小时前
饼状图修复总结
java·spring boot·uni-app·echarts
散一世繁华,颠半世琉璃7 小时前
Prometheus+Grafana轻松实现SpringBoot应用监控
spring boot·grafana·prometheus
Terio_my9 小时前
Spring Boot 热部署配置与禁用
java·spring boot·后端
z晨晨11 小时前
互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析
java·spring boot·redis·微服务·kafka·spring security·电商
码农飞哥11 小时前
AI编程开发系统001-基于SpringBoot+Vue的旅游民宿租赁系统
vue.js·spring boot·毕业设计·ai编程·计算机源码
武子康13 小时前
Java-138 深入浅出 MySQL Spring Boot 事务传播机制全解析:从 REQUIRED 到 NESTED 的实战详解 传播机制原理
java·大数据·数据库·spring boot·sql·mysql·事务
一只学java的小汉堡14 小时前
Spring Boot 配置详解:从引导器到注解实战(初学者指南)
java·spring boot·后端