基于SpringBoot+JPackage構(gòu)建獨立安裝包的操作流程
前言
從 JDK 14 開始,Java 官方引入了 JPackage 工具(在 JDK 16 正式成為標準功能),它能夠?qū)?Java 應(yīng)用打包成特定平臺的原生安裝包,自帶定制化的 JRE 運行環(huán)境。這意味著用戶無需提前安裝 Java 環(huán)境,雙擊安裝包即可完成應(yīng)用部署,極大地簡化了交付流程。
本文將介紹如何使用 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,僅打包應(yīng)用所需的模塊,大幅減小安裝包體積
簡化部署:用戶無需預(yù)裝 Java 環(huán)境,安裝包自帶運行時
1.2 JPackage 的優(yōu)勢
| 傳統(tǒng)部署方式 | JPackage 方式 |
|---|---|
| 需要預(yù)裝 JRE/JDK | 自帶 JRE,無需額外安裝 |
| 環(huán)境版本可能不匹配 | 綁定特定 JRE 版本,環(huán)境一致 |
| 手動編寫啟動腳本 | 自動生成啟動器 |
| 跨平臺需要多套腳本 | 一鍵生成各平臺安裝包 |
二、環(huán)境準備
2.1 JDK 版本要求
推薦使用 JDK 17 或更高版本(JPackage 在 JDK 16 才成為標準功能,JDK 17 是 LTS 版本)
確認 JPackage 可用:
jpackage --version
2.2 平臺特定工具
根據(jù)目標操作系統(tǒng),需要安裝對應(yīng)的打包工具:
Windows
WiX Toolset 3.11+(用于生成 .msi 安裝包)
下載地址:wixtoolset.org/
安裝后將 bin 目錄添加到系統(tǒng)環(huán)境變量 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 示例項目結(jié)構(gòu)
假設(shè)我們有一個標準的 Spring Boot 項目:
my-springboot-app/
├── src/
│ └── main/
│ ├── java/
│ └── resources/
├── pom.xml
└── target/
└── my-app-1.0.0.jar
3.2 構(gòu)建可執(zhí)行 JAR
首先使用 Maven 或 Gradle 構(gòu)建項目:
# Maven mvn clean package # Gradle gradle clean build
確保生成的 JAR 包是可執(zhí)行的(Spring Boot 默認打包方式)。
四、使用 JPackage 打包
4.1 基礎(chǔ)打包命令
以下是一個基礎(chǔ)的 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 的企業(yè)級應(yīng)用" \ --icon src/main/resources/app-icon.ico \ --win-dir-chooser \ --win-menu \ --win-shortcut
參數(shù)說明
| 參數(shù) | 說明 |
|---|---|
--input | 輸入目錄,包含 JAR 包和依賴 |
--name | 應(yīng)用名稱 |
--main-jar | 主 JAR 包文件名 |
--main-class | 主類(Spring Boot 使用 JarLauncher) |
--type | 安裝包類型(msi/exe/dmg/pkg/deb/rpm) |
--app-version | 應(yīng)用版本號 |
--icon | 應(yīng)用圖標(Windows 用 .ico,macOS 用 .icns) |
--win-dir-chooser | 允許用戶選擇安裝目錄 |
--win-menu | 創(chuàng)建開始菜單項 |
--win-shortcut | 創(chuàng)建桌面快捷方式 |
4.2 自定義 JRE(使用 jlink)
為了減小安裝包體積,可以使用 jlink 裁剪 JRE,僅包含必要的模塊。
步驟 1:查找應(yīng)用依賴的模塊
jdeps --list-deps target/my-app-1.0.0.jar
輸出示例:
java.base java.logging java.sql java.naming java.desktop ...
步驟 2:使用 jlink 創(chuàng)建自定義 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 應(yīng)用通常依賴較多模塊,建議先不裁剪 JRE,確保功能正常后再優(yōu)化。
五、不同平臺的打包示例
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 "我的應(yīng)用"
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 構(gòu)建流程
為了自動化打包流程,可以將 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 執(zhí)行構(gòu)建
mvn clean package
構(gòu)建完成后,安裝包將生成在項目根目錄下。
七、總結(jié)
JPackage 工具為 Java 應(yīng)用的分發(fā)提供了強大的支持,從簡單的命令行操作到集成到自動化構(gòu)建流程,JPackage 都能很好地滿足需求。
在實際項目中,建議根據(jù)應(yīng)用特點選擇合適的打包策略,平衡安裝包體積、部署便利性和運行性能,為用戶提供最佳的使用體驗。
以上就是基于SpringBoot+JPackage構(gòu)建獨立安裝包的操作流程的詳細內(nèi)容,更多關(guān)于SpringBoot JPackage構(gòu)建獨立安裝包的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Maven的pom.xml中設(shè)置repository不起作用問題
這篇文章主要介紹了解決Maven的pom.xml中設(shè)置repository不起作用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
SpringBoot整合Shiro兩種方式(總結(jié))
這篇文章主要介紹了SpringBoot整合Shiro兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
JSON--List集合轉(zhuǎn)換成JSON對象詳解
這篇文章主要介紹了List集合轉(zhuǎn)換成JSON對象,小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。2017-01-01
Java中MessageDigest來實現(xiàn)數(shù)據(jù)加密的方法
這篇文章主要介紹了Java中MessageDigest來實現(xiàn)數(shù)據(jù)加密的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

