在 Java 14 中,一个新的打包工具 jpackage 被引入以取代 javapackager。javapackager 曾经是 JavaFX 工具包的一部分,并在 Java 8 中被引入。由于从 Java 11 开始,JavaFX 不再是 Java API 的标准特性,因此 javapackager 也不再是标准提供的一部分。jpackage 则承担了这一职责。jpackage 允许开发者将 jar 文件打包成本地可安装的格式,如 Windows 上的 exe/msi,MacOS 上的 pkg/dmg 等。
开发者可以使用 jlink 来压缩所需的 JDK 模块至最小模块,并使用 jpackage 来创建轻量级的镜像。
jpackage 的需求背景
当软件需要分发时,首选的方式是向最终用户提供一个可安装的包。这种可安装的包通常包含了 JDK、模块、任何依赖文件以及配置,并为用户提供了熟悉的安装软件的方式。用户不应该需要预先安装 JRE 或 JDK 来运行 Java 应用程序。jpackage 处理了这些情况,并将所有必需的文件连同 JRE/JDK 一起打包进本地安装程序中。
jpackage 的命令行选项
jpackage 是一个命令行工具,提供了多种选项来定制可安装软件。以下是 jpackage 提供的一些功能:
-
-
-
开发者可以向应用程序传递参数,以及在启动应用程序时使用的 JVM 选项。
-
-
开发者可以设置选项来修改特定平台上的菜单组选项以启动应用程序。
-
-
使用 XCode,可以在 MacOS 上对包进行签名。
预备条件
使用 jpackage 工具准备可安装包所需的预备条件如下:
-
-
获取特定平台的打包工具,具体如下:
-
Windows - 为了创建 EXE/MSI 可安装程序,需要第三方库 wix 3.0 或更高版本。
-
Ubuntu Linux - 为了创建 RPM/DEB 包,需要 fakeroot 包。
-
Red Hat Linux - 为了创建 RPM/DEB 包,需要 rpm-build 包。
-
MacOS - 可以使用 Xcode 命令行工具创建包。使用
-mac-sign
选项来签名包,并使用 -icon
选项来提供自定义图标。
-
应用程序包应根据平台进行准备。对于每个平台,需要分别运行命令。
创建一个包
可以使用以下命令来创建包:
语法
jpackage --input lib \
--name Tester \
--main-jar Tester.jar \
--main-class com.tutorialspoint.Tester \
--type msi \
--java-options '--enable-preview'
其中:
-
-
-
main-jar
- 启动应用程序所需的 jar 文件。
-
main-class
- 要启动的 JAR 中的主类名。如果主 JAR 的 MANIFEST.MF 文件中包含主类名,则不需要此选项。
-
type
- 可安装类型的格式。对于 MacOS 是 DMG/PKG,对于 Windows 是 MSI/EXE,对于 Linux 是 DEB/RPM。
-
java-options
- Java 运行时的选项。
这个命令将在 Windows 上创建一个 MSI 文件,可以像其他软件一样安装使用。
示例包
public class APITester {
public static void main(String[] args) {
System.out.println("欢迎来到 TutorialsPoint.");
}
}
编译并运行程序:
$ javac APITester.java
$ jar cf APITester.jar APITester.class
输出: 为了创建 Windows 可执行文件,你需要下载 WiX Toolset v3.11.2 (wix311-binaries.zip) 并将工具包添加到你的路径中。
一旦 JAR 文件创建完成并且路径已设置好,将 JAR 文件放入名为 lib
的文件夹中,并运行以下命令来创建 Windows 的 MSI 安装程序。
$ jpackage --input lib --name APITester --main-jar APITester.jar --main-class APITester --type msi