java14学习笔记-打包工具 (Incubator)
在 JDK 14 中,jpackage 工具作为正式特性(JEP 343)被引入,它是一个用于创建自包含 Java 应用程序包的工具,能够将 Java 应用及其依赖、JRE 和启动脚本打包成平台特定的安装程序(如 .exe、.dmg、.deb 等),大大简化了 Java 应用的分发和部署流程。
目标
基于JavaFX javapackager工具创建一个简单的打包工具,该工具:
支持原生打包格式,为最终用户提供自然的安装体验。这些格式包括Windows上的msi和exe,macOS上的pkg和dmg,以及Linux上的deb和rpm。
允许在打包时指定启动时间参数。
可以从命令行直接调用,也可以通过ToolProvider API以编程方式调用。
动机
许多Java应用程序需要以一流的方式安装在本机平台上,而不是简单地放置在类路径或模块路径上。应用程序开发人员只交付一个简单的JAR文件是不够的;他们必须提供适合本机平台的可安装包。这允许以用户熟悉的方式分发、安装和卸载Java应用程序。例如,在Windows上,用户希望能够双击软件包来安装他们的软件,然后使用控制面板删除软件;在macOS上,用户希望能够双击DMG文件并将他们的应用程序拖动到application文件夹中。
打包工具还可以帮助填补其他技术留下的空白,如Java Web Start(已从Oracle的JDK 11中删除)和pack200(已在JDK 11中弃用,将在未来的版本中删除)。开发人员可以使用jlink将JDK精简到所需的最小模块集,然后使用打包工具生成一个压缩的、可安装的映像,可以部署到目标机器上。
为了满足这些要求,Oracle的JDK 8中分发了一个名为javapackager的打包工具。然而,作为JavaFX删除的一部分,它已从Oracle的JDK 11中删除。
描述
jpackage工具将Java应用程序打包成一个特定于平台的包,其中包含所有必要的依赖关系。应用程序可以作为普通JAR文件的集合或模块的集合提供。支持的特定于平台的包格式包括:
Linux:deb和rpm
macOS:pkg和dmg
Windows:msi和exe
默认情况下,jpackage以最适合其运行系统的格式生成包。
使用
非模块化
假设您有一个由JAR文件组成的应用程序,所有文件都在一个名为lib的目录中,lib/main.JAR包含main类。使用下面命令
jpackage --name myapp --input lib --main-jar main.jar
将以本地系统的默认格式打包应用程序,将生成的包文件保留在当前目录中。如果是MANIFEST。main.jar中的MF文件没有main Class属性,则必须显式指定主类:
jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main
包的名称将是myapp,但包文件本身的名称会更长,并以包类型结尾(例如myapp.exe)。该软件包将包括一个应用程序的启动器,也称为myapp。为了启动应用程序,启动器将把从输入目录复制的每个JAR文件放置在JVM的类路径上。
如果希望以默认格式以外的格式生成包,请使用--type选项。例如,要在macOS上生成pkg文件而不是dmg文件:
jpackage --name myapp --input lib --main-jar main.jar --type pkg
模块化
如果您有一个模块化应用程序,由lib目录中的模块化JAR文件和/或JMOD文件组成,主类在模块myapp中,那么使用下面命令
jpackage --name myapp --module-path lib -m myapp
将打包它。如果myapp模块没有标识其主类,那么您必须再次明确指定:
jpackage --name myapp --module-path lib -m myapp/myapp.Main
(打包模块化JAR或JMOD文件时,您可以使用JAR和JMOD工具的--main class选项指定主类。)
打包参数
--app-version <version> 应用程序版本
--copyright <string> 版权
--description <string> 描述
--license-file <file> 许可证文件
--name <string> 名称
--vendor <string> 供应商