当前位置: 首页 > news >正文

创建可执行 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 插件配置:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

注意
使用 spring-boot-starter-parent 作为父 POM 时会自动配置 repackage 目标,否则需手动声明(详见插件文档)。


2️⃣ 执行打包命令

在命令行运行打包指令:

$ 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️⃣ 运行应用
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

🖥 控制台将显示 Spring Boot 启动日志,按 ctrl-c 可退出应用。


📦 Gradle 构建方式

1️⃣ 执行构建命令
$ gradle bootJar

📌 输出示例

BUILD SUCCESSFUL in 639ms

2️⃣ 检查生成文件

build/libs 目录可找到约 18MB 的 jar 文件,使用以下命令查看内容:

$ jar tvf build/libs/myproject-0.0.1-SNAPSHOT.jar

3️⃣ 运行应用
$ java -jar build/libs/myproject-0.0.1-SNAPSHOT.jar

🔄 运行效果与 Maven 版本一致,通过 ctrl-c 终止应用。


📚 [术语对照]

• 🏷 uber jar - 超级归档包
• 📦 fat jar - 胖归档包
• 🔄 nested jar - 嵌套式归档包
• ⚙ repackage goal - 重新打包目标
• 📂 build/libs directory - 构建/库目录

相关文章:

  • 如何在 Conda 环境中降级 Python 版本:详细指南
  • MyBatis 插件开发的完整详细例子
  • 通过门店销售明细表用Python Pandas得到每月每个门店的销冠和按月的同比环比数据
  • Pygame字体与UI:打造游戏菜单和HUD界面
  • 《淘宝API数据治理实践:采集字段标准化与数据质量监控体系》
  • 6.1 客户服务:智能客服与自动化支持系统的构建
  • 获取房源信息并完成可视化——网络爬虫实战1
  • C++模拟Java C#的 finally
  • 揭开人工智能的神秘面纱:从概念到人工神经网络
  • springboot入门-JPA(Java Persistence API)注解与实体类Model
  • 线程池(二):深入剖析synchronized关键字的底层原理
  • 上位机知识篇---寻址方式
  • 电商秒杀系统技术栈与难点解析 - Java架构师面试实战
  • Unity网络编程入门:掌握Netcode for GameObjects实现多人游戏基础(Day 39)
  • Word/WPS 删除最后一页空白页,且保持前面布局样式不变
  • Cribl 上传lookup 表,传入数据进event
  • 【Java面试笔记:进阶】21.Java并发类库提供的线程池有哪几种? 分别有什么特点?
  • 【软考-架构】13.5、中间件
  • 某海关某署 【瑞数6】逆向分析
  • 《代码之美:静态分析工具与 CI 集成详解》
  • 伊朗爆炸港口已恢复货物进出口工作
  • 来论|如何看待韩企在美申请“饺子”专利
  • 第二部以“法典”命名的法律!生态环境法典编纂迈出“关键步”
  • 哈马斯官员:只要以军持续占领,哈马斯就不会放下武器
  • 深圳大学传播学院院长巢乃鹏已任深圳大学副校长
  • 从“龙队”到“龙副主席”,国乒这批退役球员为何不当教练了