核心内容摘要
英雄联盟智能辅助系统:从操作烦恼到游戏掌控的效率革命
你是不是也遇到过这种情况辛辛苦苦写好了一个 Spring Boot 项目打成 jar 包发给别人结果对方一句“你这还要装 Java 啊”对于很多非技术用户来说“装 JDK、配环境变量”这一步就已经把人劝退了。
好在从 JDK 14 开始Java 官方提供了一个神器——jpackage。
它能把你的 Spring Boot 应用和 JRE 一起打包成一个原生的安装包Windows 上是.exe/.msimacOS 上是.dmg/.pkgLinux 上是.deb/.rpm。
用户拿到手双击安装完事。
今天我们就来聊聊如何用Spring Boot jpackage构建独立安装包让你的交付体验从“劝退级”提升到“专业级”。
什么是 jpackagejpackage是 JDK 自带的一个命令行工具位于$JAVA_HOME/bin目录下。
它的核心能力是生成平台原生安装包不再分发裸 jar而是生成用户熟悉的安装程序。
捆绑 JRE可以将 JRE 一起打包实现“开箱即用”用户无需预先安装 Java。
简化部署自动生成启动器、菜单项、桌面快捷方式等体验与本地应用无异。
简单来说以前是“发 jar 说明书”现在是“双击安装完事”。
️ 环境准备在开始之前请确保你的环境满足以下条件JDK 版本推荐使用JDK 17 或更高版本。
jpackage 在 JDK 14 中作为预览功能引入在 JDK 16 成为正式功能而 JDK 17 是当前的长期支持LTS版本更为稳妥。
打包平台必须在目标平台上进行打包。
例如要生成 Windows 的.exe就需要在 Windows 系统上执行命令。
jpackage 不支持跨平台打包。
辅助工具Windows若要生成.msi安装包需要安装WiX Toolset
11并将其bin目录添加到系统PATH环境变量中。
macOS需要安装Xcode 命令行工具(xcode-select --install)。
Linux需要安装fakeroot和rpm-build等打包工具。
第一步构建可执行 JAR这是最基础的一步。
首先确保你的 Spring Boot 项目能够正常打包和运行。
使用 Maven 或 Gradle 构建项目bashMavenmvn clean packageGradle./gradlew clean build构建成功后你会在target/(Maven) 或build/libs/(Gradle) 目录下找到一个可执行的 fat jar例如my-app-
1.
0.
jar。
你可以通过下面的命令验证 jar 是否可以正常运行bashjava -jar target/my-app-
1.
0.
jar如果应用能正常启动说明前置条件已经满足我们可以进入下一步。
⚙️ 第二步使用 jpackage 打包
基础打包命令假设你的可执行 jar 是target/my-app-
1.
0.
jar主类是com.example.demo.DemoApplication。
在 Windows 上你可以使用以下命令生成一个.msi安装包bashjpackage ^–name MySpringBootApp ^–input target ^–main-jar my-app-
1.
0.
jar ^–main-class org.springframework.boot.loader.JarLauncher ^–type msi ^–app-version
1.
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: 输出安装包的类型msi或exe。
--app-version: 应用版本号。
--vendor: 应用供应商名称。
--description: 应用描述。
--icon: 应用图标文件路径Windows 为.icomacOS 为.icns。
--win-dir-chooser: 允许用户自定义安装目录。
--win-menu: 在开始菜单中创建快捷方式。
--win-shortcut: 在桌面上创建快捷方式。
执行完毕后你会在指定的输出目录默认为当前目录下找到MySpringBootApp-
1.
0.
msi文件。
双击它就可以像安装普通 Windows 软件一样完成部署。
打包为 EXE 格式如果你更倾向于生成.exe格式的安装包只需将--type参数改为exe即可。
生成.exe同样需要 WiX Toolset 的支持。
bashjpackage ^–name MySpringBootApp ^–input target ^–main-jar my-app-
1.
0.
jar ^–main-class org.springframework.boot.loader.JarLauncher ^–type exe ^–app-version
1.
0 ^–vendor “我的公司” ^–icon src/main/resources/app-icon.ico ^–win-dir-chooser ^–win-menu ^–win-shortcut
其他平台打包示例jpackage 也支持为 macOS 和 Linux 平台生成原生安装包。
macOS (生成 .dmg)bashjpackage–name MyApp–input target–main-jar my-app-
1.
0.
jar–main-class org.springframework.boot.loader.JarLauncher–type dmg–app-version
1.
0–icon src/main/resources/app.icns–mac-package-name “com.mycompany.myapp”–mac-package-identifier “com.mycompany.myapp”Linux (生成 .deb)bashjpackage–name myapp–input target–main-jar my-app-
1.
0.
jar–main-class org.springframework.boot.loader.JarLauncher–type deb–app-version
1.
0–icon src/main/resources/app.png–linux-shortcut–linux-menu-group “Development” 进阶使用 jlink 定制 JRE减小安装包体积默认情况下jpackage 会将整个 JDK 打包进去导致安装包体积较大。
为了优化我们可以使用jlink工具创建一个只包含应用所需模块的“精简版”JRE。
分析依赖模块首先使用jdeps命令分析你的 jar 包依赖了哪些 JDK 模块。
bashjdeps --list-deps target/my-app-
1.
0.
jar这会输出一系列模块名如java.base,java.logging,java.sql等。
创建自定义 JRE使用jlink和jdeps的输出结果创建精简 JRE。
bashjlink–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–compress2这行命令会创建一个名为custom-jre的目录其中只包含运行你的应用所必需的模块。
使用自定义 JRE 打包最后在调用jpackage时通过--runtime-image参数指定我们刚刚创建的custom-jre目录。
bashjpackage–input target–name MySpringBootApp–main-jar my-app-
1.
0.
jar–main-class org.springframework.boot.loader.JarLauncher–type msi–runtime-image custom-jre–app-version
1.
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命令。
xmlorg.springframework.bootspring-boot-maven-plugin!-- JPackage 打包插件 -- plugin groupIdorg.codehaus.mojo/groupId artifactIdexec-maven-plugin/artifactId version
3.
0/version executions execution idjpackage/id phasepackage/phase goals goalexec/goal /goals configuration executablejpackage/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 argumentorg.springframework.boot.loader.JarLauncher/argument argument--type/argument argumentmsi/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配置完成后只需执行一条命令即可完成从构建到打包的全过程bashmvn clean package
注意事项平台相关性jpackage 不支持跨平台打包。
必须在目标操作系统上进行打包操作。
JRE 体积包含完整 JDK 的安装包体积较大。
建议使用jlink定制 JRE 以优化体积但这需要额外的测试工作以确保功能不受影响。
应用配置对于需要外部化配置的应用如application.properties可以考虑在安装包外部提供一个配置目录并在启动脚本中通过--spring.config.location参数指定其位置方便用户修改。
控制台窗口在 Windows 上如果不希望看到启动时的控制台窗口可以移除--win-console参数。
反之如果需要查看日志输出则建议保留该参数。
✨
总结通过Spring Boot jpackage我们可以轻松地将应用打包成用户友好的原生安装包极大地提升了交付的专业度和用户体验。
核心流程可以概括为使用 Maven/Gradle 构建可执行 JAR。
使用jpackage命令生成原生安装包.exe/.msi/.dmg等。
可选使用jlink定制 JRE 以减小安装包体积。
可选将jpackage命令集成到 Maven/Gradle 构建流程中实现自动化打包。
关注公众号【云技纵横】看更多的分布式缓存进阶技巧和干货