注册

Spring Boot + 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

构建完成后,安装包将生成在项目根目录下。


作者:Java编程爱好者
来源:juejin.cn/post/7609677415800373288

0 个评论

要回复文章请先登录注册