news 2026/2/27 17:20:56

别再发 jar 了!用 Spring Boot + jpackage 一键生成 exe / msi 安装包

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再发 jar 了!用 Spring Boot + jpackage 一键生成 exe / msi 安装包

你是不是也遇到过这种情况:

辛辛苦苦写好了一个 Spring Boot 项目,打成 jar 包发给别人,结果对方一句:“你这还要装 Java 啊?”

对于很多非技术用户来说,“装 JDK、配环境变量”这一步,就已经把人劝退了。

好在,从 JDK 14 开始,Java 官方提供了一个神器——jpackage。它能把你的 Spring Boot 应用和 JRE 一起打包成一个原生的安装包(Windows 上是.exe/.msi,macOS 上是.dmg/.pkg,Linux 上是.deb/.rpm)。用户拿到手,双击安装,完事。

今天,我们就来聊聊如何用Spring Boot + jpackage构建独立安装包,让你的交付体验从“劝退级”提升到“专业级”。


🤔 什么是 jpackage?

jpackage是 JDK 自带的一个命令行工具,位于$JAVA_HOME/bin目录下。它的核心能力是:

  • 生成平台原生安装包:不再分发裸 jar,而是生成用户熟悉的安装程序。
  • 捆绑 JRE:可以将 JRE 一起打包,实现“开箱即用”,用户无需预先安装 Java。
  • 简化部署:自动生成启动器、菜单项、桌面快捷方式等,体验与本地应用无异。

简单来说,以前是“发 jar + 说明书”,现在是“双击安装,完事”。


🛠️ 环境准备

在开始之前,请确保你的环境满足以下条件:

  1. JDK 版本:推荐使用JDK 17 或更高版本。jpackage 在 JDK 14 中作为预览功能引入,在 JDK 16 成为正式功能,而 JDK 17 是当前的长期支持(LTS)版本,更为稳妥。
  2. 打包平台必须在目标平台上进行打包。例如,要生成 Windows 的.exe,就需要在 Windows 系统上执行命令。jpackage 不支持跨平台打包。
  3. 辅助工具
    • Windows:若要生成.msi安装包,需要安装WiX Toolset 3.11+,并将其bin目录添加到系统PATH环境变量中。
    • macOS:需要安装Xcode 命令行工具(xcode-select --install)。
    • Linux:需要安装fakerootrpm-build等打包工具。

📦 第一步:构建可执行 JAR

这是最基础的一步。首先,确保你的 Spring Boot 项目能够正常打包和运行。

使用 Maven 或 Gradle 构建项目:

bash

Maven

mvn clean package

Gradle

./gradlew clean build

构建成功后,你会在target/(Maven) 或build/libs/(Gradle) 目录下找到一个可执行的 fat jar,例如my-app-1.0.0.jar

你可以通过下面的命令验证 jar 是否可以正常运行:

bash
java -jar target/my-app-1.0.0.jar

如果应用能正常启动,说明前置条件已经满足,我们可以进入下一步。


⚙️ 第二步:使用 jpackage 打包

1. 基础打包命令

假设你的可执行 jar 是target/my-app-1.0.0.jar,主类是com.example.demo.DemoApplication

在 Windows 上,你可以使用以下命令生成一个.msi安装包:

bash
jpackage ^
–name MySpringBootApp ^
–input target ^
–main-jar my-app-1.0.0.jar ^
–main-class org.springframework.boot.loader.JarLauncher ^
–type msi ^
–app-version 1.0.0 ^
–vendor “我的公司” ^
–description “基于 Spring Boot 的企业级应用” ^
–icon src/main/resources/app-icon.ico ^
–win-dir-chooser ^
–win-menu ^
–win-shortcut

参数说明:

  • --name: 应用名称,将用于安装目录和快捷方式。
  • --input: 包含 jar 包的目录。
  • --main-jar: 可执行 jar 包的文件名。
  • --main-class:注意,对于 Spring Boot 的可执行 jar,这里应指定为org.springframework.boot.loader.JarLauncher,而不是你自己的@SpringBootApplication标注的类。
  • --type: 输出安装包的类型,msiexe
  • --app-version: 应用版本号。
  • --vendor: 应用供应商名称。
  • --description: 应用描述。
  • --icon: 应用图标文件路径(Windows 为.ico,macOS 为.icns)。
  • --win-dir-chooser: 允许用户自定义安装目录。
  • --win-menu: 在开始菜单中创建快捷方式。
  • --win-shortcut: 在桌面上创建快捷方式。

执行完毕后,你会在指定的输出目录(默认为当前目录)下找到MySpringBootApp-1.0.0.msi文件。双击它,就可以像安装普通 Windows 软件一样完成部署。

2. 打包为 EXE 格式

如果你更倾向于生成.exe格式的安装包,只需将--type参数改为exe即可。生成.exe同样需要 WiX Toolset 的支持。

bash
jpackage ^
–name MySpringBootApp ^
–input target ^
–main-jar my-app-1.0.0.jar ^
–main-class org.springframework.boot.loader.JarLauncher ^
–type exe ^
–app-version 1.0.0 ^
–vendor “我的公司” ^
–icon src/main/resources/app-icon.ico ^
–win-dir-chooser ^
–win-menu ^
–win-shortcut

3. 其他平台打包示例

jpackage 也支持为 macOS 和 Linux 平台生成原生安装包。

  • macOS (生成 .dmg)

    bash
    jpackage
    –name MyApp
    –input target
    –main-jar my-app-1.0.0.jar
    –main-class org.springframework.boot.loader.JarLauncher
    –type dmg
    –app-version 1.0.0
    –icon src/main/resources/app.icns
    –mac-package-name “com.mycompany.myapp”
    –mac-package-identifier “com.mycompany.myapp”

  • Linux (生成 .deb)

    bash
    jpackage
    –name myapp
    –input target
    –main-jar my-app-1.0.0.jar
    –main-class org.springframework.boot.loader.JarLauncher
    –type deb
    –app-version 1.0.0
    –icon src/main/resources/app.png
    –linux-shortcut
    –linux-menu-group “Development”


📉 进阶:使用 jlink 定制 JRE,减小安装包体积

默认情况下,jpackage 会将整个 JDK 打包进去,导致安装包体积较大。为了优化,我们可以使用jlink工具创建一个只包含应用所需模块的“精简版”JRE。

  1. 分析依赖模块

    首先,使用jdeps命令分析你的 jar 包依赖了哪些 JDK 模块。

    bash
    jdeps --list-deps target/my-app-1.0.0.jar

    这会输出一系列模块名,如java.base,java.logging,java.sql等。

  2. 创建自定义 JRE

    使用jlinkjdeps的输出结果创建精简 JRE。

    bash
    jlink
    –add-modules java.base,java.logging,java.sql,java.naming,java.desktop,java.xml,java.management
    –output custom-jre
    –strip-debug
    –no-header-files
    –no-man-pages
    –compress=2

    这行命令会创建一个名为custom-jre的目录,其中只包含运行你的应用所必需的模块。

  3. 使用自定义 JRE 打包

    最后,在调用jpackage时,通过--runtime-image参数指定我们刚刚创建的custom-jre目录。

    bash
    jpackage
    –input target
    –name MySpringBootApp
    –main-jar my-app-1.0.0.jar
    –main-class org.springframework.boot.loader.JarLauncher
    –type msi
    –runtime-image custom-jre
    –app-version 1.0.0
    –vendor “我的公司”
    –icon src/main/resources/app-icon.ico
    –win-dir-chooser
    –win-menu
    –win-shortcut

    这样生成的安装包体积会显著减小。建议先不使用--runtime-image确保应用功能正常,再逐步裁剪 JRE 模块。


🤖 自动化:集成到 Maven 构建流程

手动输入长串的jpackage命令容易出错且不便维护。我们可以将其集成到 Maven 的pom.xml中,实现一键打包。

使用exec-maven-plugin插件,在package阶段自动执行jpackage命令。

xml




org.springframework.boot
spring-boot-maven-plugin

<!-- JPackage 打包插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>jpackage</id> <phase>package</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>jpackage</executable> <arguments> <argument>--name</argument> <argument>${project.name}</argument> <argument>--input</argument> <argument>${project.build.directory}</argument> <argument>--main-jar</argument> <argument>${project.build.finalName}.jar</argument> <argument>--main-class</argument> <argument>org.springframework.boot.loader.JarLauncher</argument> <argument>--type</argument> <argument>msi</argument> <argument>--app-version</argument> <argument>${project.version}</argument> <argument>--vendor</argument> <argument>我的公司</argument> <argument>--icon</argument> <argument>${project.basedir}/src/main/resources/app-icon.ico</argument> <argument>--win-dir-chooser</argument> <argument>--win-menu</argument> <argument>--win-shortcut</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins>

配置完成后,只需执行一条命令,即可完成从构建到打包的全过程:

bash
mvn clean package


💡 注意事项

  1. 平台相关性:jpackage 不支持跨平台打包。必须在目标操作系统上进行打包操作。
  2. JRE 体积:包含完整 JDK 的安装包体积较大。建议使用jlink定制 JRE 以优化体积,但这需要额外的测试工作以确保功能不受影响。
  3. 应用配置:对于需要外部化配置的应用(如application.properties),可以考虑在安装包外部提供一个配置目录,并在启动脚本中通过--spring.config.location参数指定其位置,方便用户修改。
  4. 控制台窗口:在 Windows 上,如果不希望看到启动时的控制台窗口,可以移除--win-console参数。反之,如果需要查看日志输出,则建议保留该参数。

✨ 总结

通过Spring Boot + jpackage,我们可以轻松地将应用打包成用户友好的原生安装包,极大地提升了交付的专业度和用户体验。

核心流程可以概括为:

  1. 使用 Maven/Gradle 构建可执行 JAR。
  2. 使用jpackage命令生成原生安装包(.exe/.msi/.dmg等)。
  3. (可选)使用jlink定制 JRE 以减小安装包体积。
  4. (可选)将jpackage命令集成到 Maven/Gradle 构建流程中,实现自动化打包。

🔥 关注公众号【云技纵横】,看更多的分布式缓存进阶技巧和干货

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 9:09:09

Android16 RK3576 默认修改时间为24小时制

项目需求修改时间为24小时制,修改如下: 在frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java里面修改 diff --git a/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/base/pa…

作者头像 李华
网站建设 2026/2/17 22:33:23

119页精品PPT | 某光伏巨头数字化转型SAP蓝图解决方案

光伏能源集团通常采用多法人、多地域组织架构。不同子公司业务流程不统一&#xff0c;数据分散存储在各系统中。跨国销售涉及多方交易&#xff0c;手工处理方式效率低下。客户信用评级缺乏统一标准&#xff0c;坏账风险难以控制。销售、生产、财务环节相互脱节&#xff0c;订单…

作者头像 李华
网站建设 2026/2/22 15:56:42

基于深度学习YOLOv11的足球运动员检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 本文设计并实现了一种基于深度学习YOLOv11算法的足球运动员检测系统&#xff0c;能够实时检测足球场上的运动员、守门员、裁判及足球目标。系统采用YOLOv11模型进行目标检测&#xff0c;并基于PyTorch框架完成训练与部署。共4类目标&#xff08;足球、守门员、球…

作者头像 李华
网站建设 2026/2/25 6:52:31

基于深度学习YOLOv12的轴承缺陷识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 轴承作为机械设备中的关键部件&#xff0c;其健康状态直接影响设备的运行效率与安全性。传统轴承缺陷检测方法依赖人工检查&#xff0c;存在效率低、主观性强等问题。为此&#xff0c;本文提出了一种基于深度学习YOLOv12的轴承缺陷识别检测系统&#xff0c;能够高…

作者头像 李华
网站建设 2026/2/26 16:05:43

Thinkphp和Laravel框架的农家乐民宿客房美食预订活动管理系统

目录ThinkPHP与Laravel框架的农家乐民宿管理系统摘要功能模块设计ThinkPHP实现特点Laravel实现优势技术对比适用场景建议开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;ThinkPHP与Laravel框架的农家乐民宿管理系统摘要 功能模…

作者头像 李华