基于SpringBoot+JPackage构建独立安装包的操作流程
作者:风象南
前言
从 JDK 14 开始,Java 官方引入了 JPackage 工具(在 JDK 16 正式成为标准功能),它能够将 Java 应用打包成特定平台的原生安装包,自带定制化的 JRE 运行环境。这意味着用户无需提前安装 Java 环境,双击安装包即可完成应用部署,极大地简化了交付流程。
本文将介绍如何使用 JPackage 工具将 Spring Boot 项目打包成 Windows、macOS 或 Linux 平台的原生安装包。
一、JPackage 简介
1.1 什么是 JPackage
JPackage 是 JDK 自带的打包工具,位于 $JAVA_HOME/bin 目录下。它的核心功能是:
生成平台原生安装包:Windows 的 .exe/.msi、macOS 的 .dmg/.pkg、Linux 的 .deb/.rpm
自定义 JRE:使用 jlink 工具裁剪 JDK,仅打包应用所需的模块,大幅减小安装包体积
简化部署:用户无需预装 Java 环境,安装包自带运行时
1.2 JPackage 的优势
| 传统部署方式 | JPackage 方式 |
|---|---|
| 需要预装 JRE/JDK | 自带 JRE,无需额外安装 |
| 环境版本可能不匹配 | 绑定特定 JRE 版本,环境一致 |
| 手动编写启动脚本 | 自动生成启动器 |
| 跨平台需要多套脚本 | 一键生成各平台安装包 |
二、环境准备
2.1 JDK 版本要求
推荐使用 JDK 17 或更高版本(JPackage 在 JDK 16 才成为标准功能,JDK 17 是 LTS 版本)
确认 JPackage 可用:
jpackage --version
2.2 平台特定工具
根据目标操作系统,需要安装对应的打包工具:
Windows
WiX Toolset 3.11+(用于生成 .msi 安装包)
下载地址:wixtoolset.org/
安装后将 bin 目录添加到系统环境变量 PATH
macOS
Xcode 命令行工具(用于生成 .dmg/.pkg)
xcode-select --install
Linux
Debian/Ubuntu:安装 fakeroot
sudo apt-get install fakeroot
RedHat/CentOS:安装 rpm-build
sudo yum install rpm-build
三、Spring Boot 项目准备
3.1 示例项目结构
假设我们有一个标准的 Spring Boot 项目:
my-springboot-app/
├── src/
│ └── main/
│ ├── java/
│ └── resources/
├── pom.xml
└── target/
└── my-app-1.0.0.jar
3.2 构建可执行 JAR
首先使用 Maven 或 Gradle 构建项目:
# Maven mvn clean package # Gradle gradle clean build
确保生成的 JAR 包是可执行的(Spring Boot 默认打包方式)。
四、使用 JPackage 打包
4.1 基础打包命令
以下是一个基础的 JPackage 命令示例(以 Windows 为例):
jpackage \ --input target \ --name MySpringBootApp \ --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
参数说明
| 参数 | 说明 |
|---|---|
--input | 输入目录,包含 JAR 包和依赖 |
--name | 应用名称 |
--main-jar | 主 JAR 包文件名 |
--main-class | 主类(Spring Boot 使用 JarLauncher) |
--type | 安装包类型(msi/exe/dmg/pkg/deb/rpm) |
--app-version | 应用版本号 |
--icon | 应用图标(Windows 用 .ico,macOS 用 .icns) |
--win-dir-chooser | 允许用户选择安装目录 |
--win-menu | 创建开始菜单项 |
--win-shortcut | 创建桌面快捷方式 |
4.2 自定义 JRE(使用 jlink)
为了减小安装包体积,可以使用 jlink 裁剪 JRE,仅包含必要的模块。
步骤 1:查找应用依赖的模块
jdeps --list-deps target/my-app-1.0.0.jar
输出示例:
java.base java.logging java.sql java.naming java.desktop ...
步骤 2:使用 jlink 创建自定义 JRE
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
步骤 3:使用自定义 JRE 打包
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 "我的公司"
注意:Spring Boot 应用通常依赖较多模块,建议先不裁剪 JRE,确保功能正常后再优化。
五、不同平台的打包示例
5.1 Windows 平台(MSI)
jpackage \ --input target \ --name MyApp \ --main-jar my-app-1.0.0.jar \ --main-class org.springframework.boot.loader.JarLauncher \ --type msi \ --app-version 1.0.0 \ --icon src/main/resources/app.ico \ --win-dir-chooser \ --win-menu \ --win-shortcut \ --win-menu-group "我的应用"
5.2 macOS 平台(DMG)
jpackage \ --input target \ --name MyApp \ --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"
5.3 Linux 平台(DEB)
jpackage \ --input target \ --name myapp \ --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"
六、集成到 Maven 构建流程
为了自动化打包流程,可以将 JPackage 命令集成到 Maven 的 pom.xml 中。
6.1 使用 exec-maven-plugin
在 pom.xml 中添加以下插件配置:
<build>
<plugins>
<!-- Spring Boot Maven 插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</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>--input</argument>
<argument>target</argument>
<argument>--name</argument>
<argument>MySpringBootApp</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>--win-dir-chooser</argument>
<argument>--win-menu</argument>
<argument>--win-shortcut</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
6.2 执行构建
mvn clean package
构建完成后,安装包将生成在项目根目录下。
七、总结
JPackage 工具为 Java 应用的分发提供了强大的支持,从简单的命令行操作到集成到自动化构建流程,JPackage 都能很好地满足需求。
在实际项目中,建议根据应用特点选择合适的打包策略,平衡安装包体积、部署便利性和运行性能,为用户提供最佳的使用体验。
以上就是基于SpringBoot+JPackage构建独立安装包的操作流程的详细内容,更多关于SpringBoot JPackage构建独立安装包的资料请关注脚本之家其它相关文章!
