JDK14,Java终于可以打包exe文件了!

2020/03/04 16:05
阅读数 1W

消息来源于:https://openjdk.java.net/jeps/343        

       许多Java应用程序需要以一流的方式安装在本机平台上,而不是简单地放置在类路径或模块路径上。对于应用程序开发人员来说,交付简单的JAR文件是不够的。他们必须提供适合本机平台的可安装软件包。这允许以用户熟悉的方式分发,安装和卸载Java应用程序。例如,在Windows上,用户希望能够双击一个软件包来安装他们的软件,然后使用控制面板删除该软件。在macOS上,用户希望能够双击DMG文件并将其应用程序拖到Application文件夹中。

打包工具还可以帮助填补其他技术留下的空白,例如Java Web Start(已从Oracle的JDK 11中删除)和Java Web Start(pack200已在JDK 11中弃用,可在以后的版本中删除)。开发人员可以jlink用来将JDK简化为所需的最小模块集,然后使用打包工具生成一个压缩的,可安装的映像,该映像可以部署到目标计算机。

为了以前满足这些要求,javapackagerOracle的JDK 8分发了一个称为的打包工具。但是,作为删除JavaFX的一部分,该工具已从Oracle的JDK 11中删除。

描述

jpackage工具将Java应用程序打包到特定于平台的程序包中,该程序包包含所有必需的依赖项。该应用程序可以作为普通JAR文件的集合或作为模块的集合提供。受支持的特定于平台的软件包格式为:

  • Linux:debrpm
  • macOS:pkgdmg
  • Windows:msiexe

默认情况下,jpackage以最适合其运行系统的格式生成软件包。

基本用法:非模块化应用

假设您有一个包含JAR文件的应用程序,所有应用程序都位于一个名为的目录中lib,并且lib/main.jar包含主类。然后命令

$ jpackage --name myapp --input lib --main-jar main.jar

将以本地系统的默认格式打包应用程序,将生成的打包文件保留在当前目录中。如果MANIFEST.MF文件中main.jar没有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

基本用法:模块化应用

如果您有一个模块化应用程序,该应用程序由目录中的模块化JAR文件和/或JMOD文件组成,并且模块中lib包含主类myapp,则命令

$ jpackage --name myapp --module-path lib -m myapp

将其打包。如果myapp模块未标识其主类,则必须再次明确指定:

$ jpackage --name myapp --module-path lib -m myapp/myapp.Main

(打包模块化JAR或JMOD文件时,可以使用和工具--main-class选项指定主类。)jarjmod

包元数据

jpackage工具允许您为包指定各种元数据。所有平台共有的选项是:

  • --app-version <version>
  • --copyright <string>
  • --description <string>
  • --license-file <file>
  • --name <string>
  • --vendor <string>

该工具以适合程序包类型的方式使用提供给这些选项的参数。特定于平台的软件包元数据选项如下所述

文件关联

您可以通过--file-associations选项为应用程序定义一个或多个文件类型关联,该选项可以多次使用。此选项的参数是一个属性文件,具有以下一个或多个键的值:

  • extension 指定与应用程序关联的文件扩展名,
  • mime-type 指定要与应用程序关联的文件的MIME类型,
  • icon 在应用程序图像中指定一个与此关联一起使用的图标,并且
  • description 指定关联的简短描述。

启动器

默认情况下,该jpackage工具为您的应用程序创建一个简单的本机启动器。您可以通过以下选项来自定义默认启动器:

  • --arguments <string> —如果未将命令行参数提供给启动器,则将命令行参数传递给主类(此选项可以多次使用)
  • --java-options <string> —传递给JVM的选项(此选项可以多次使用)

如果您的应用程序需要其他启动器,则可以通过以下--add-launcher选项添加它们:

  • --add-launcher <launcher-name>=<file>

命名的<file>应该是一个属性文件,其中包含一个或多个键app-version icon argumentsjava-options main-class main-jar module或的值win-console。这些键的值将被解释为具有相同名称的选项的参数,但相对于正在创建的启动器而不是默认启动器。该--add-launcher选项可以多次使用。

应用图片

jpackage工具将构建应用程序映像,作为其在最后一步中调用的特定于平台的打包工具的输入。通常,此图像是一个临时工件,但是有时您需要在打包之前对其进行自定义。因此,您可以分jpackage两个步骤运行该工具。首先,使用特殊包类型创建初始应用程序映像app-image

$ jpackage --name myapp --module-path lib -m myapp --type app-image

这将在myapp目录中生成一个应用程序映像。根据需要自定义该映像,然后通过以下--app-image选项创建最终包:

$ jpackage --name myapp --app-image myapp

运行时映像

应用程序映像包含组成您的应用程序的文件以及将运行您的应用程序的JDK 运行时映像。默认情况下,该jpackage工具调用该jlink工具来创建运行时映像。图像的内容取决于应用程序的类型:

  • 对于由JAR文件组成的非模块化应用程序,运行时映像包含与常规启动程序提供给未命名模块中的类路径应用程序相同的JDK模块集java

  • 对于由模块化JAR文件和/或JMOD文件组成的模块化应用程序,运行时映像包含应用程序的主模块及其所有依赖项的可传递闭包。它不会包括所有可用的服务提供商;如果要绑定这些对象,请为工具指定--bind-services选项jpackage

在任何一种情况下,如果要将其他模块添加到运行时映像,都可以将该--add-modules选项与jpackage工具一起使用。运行时映像中的模块列表在映像的release文件中可用。

jpackage工具创建的运行时映像不包含调试符号,常用的JDK命令,手册页或src.zip文件。

如果您希望进一步自定义运行时映像,则可以调用jlink自己,并jpackage通过该--runtime-image选项将生成的映像传递给工具。例如,如果您使用该jdeps工具确定非模块化应用程序仅需要java.basejava.sql模块,则可以显着减小软件包的大小:

$ jlink --add-modules java.base,java.sql --output myjre $ jpackage --name myapp --input lib --main-jar main.jar --runtime-image myjre

平台特定的详细信息

本节描述了该jpackage工具特定于平台的方面,包括应用程序图像布局和特定于平台的选项。该命令jpackage --help将打印所有选项的摘要。

jpackage工具创建的应用程序映像包含一些未在下面的布局中显示的文件。此类文件应视为可能更改的实现详细信息。

的Linux

myapp/ bin/ // Application launcher(s) myapp lib/ app/ myapp.cfg // Configuration info, created by jpackage myapp.jar // JAR files, copied from the --input directory mylib.jar ... runtime/ // JDK runtime image

Linux上的默认安装目录是/opt。可以通过该--install-dir选项覆盖。

Linux特定的选项:

  • --linux-package-name <package name> — Linux软件包的名称,默认为应用程序名称
  • --linux-deb-maintainer <email address> — DEB软件包的维护者
  • --linux-menu-group <menu-group-name> —此应用程序所在的菜单组
  • --linux-package-deps <deps> —应用程序所需的软件包或功能
  • --linux-rpm-license-type <type string> —许可证的类型(License: <value>RPM .spec文件的类型)
  • --linux-app-release <release value> — RPM <name>.spec文件的发布值或DEB控制文件的Debian修订版值
  • --linux-app-category <category value> — RPM <name>.spec文件的组值或DEB控制文件的Section值
  • --linux-shortcut 为应用程序创建快捷方式

苹果系统

MyApp.app/ Contents/ Info.plist MacOS/ // Application launcher(s) MyApp Resources/ // Icons, etc. app/ MyApp.cfg // Configuration info, created by jpackage myapp.jar // JAR files, copied from the --input directory mylib.jar ... runtime/ // JDK runtime image

macOS上的默认安装目录是/Applications。可以通过该--install-dir选项覆盖。

macOS特定的选项:

  • --mac-package-identifier <string> —唯一标识macOS应用程序的标识符(默认为主类名称;仅限于字母数字,连字符和句点字符)
  • --mac-package-name <string> —出现在菜单栏中的应用程序名称(默认为应用程序名称;长度必须少于16个字符,并且适合在菜单栏和应用程序“信息”窗口中显示)
  • --mac-package-signing-prefix <string> —在对应用程序捆绑包进行签名时,该值会附加到所有需要签名但没有现有捆绑包标识符的组件上
  • --mac-sign —要求对捆绑包进行签名
  • --mac-signing-keychain <file> —钥匙串搜索签名身份的路径(默认为标准钥匙串)
  • --mac-signing-key-user-name <team name> — Apple签名身份的团队名称部分(例如,“ Developer ID Application:”)

视窗

MyApp/ MyApp.exe // Application launcher(s) app/ MyApp.cfg // Configuration info, created by jpackage myapp.jar // JAR files, copied from the --input directory mylib.jar ... runtime/ // JDK runtime image

Windows上的默认安装目录是C:/Program Files/。可以通过该--install-dir选项覆盖。

Windows特定的选项:

  • --win-console —为应用程序创建控制台启动器(应为需要控制台交互的应用程序指定)
  • --win-dir-chooser —添加一个对话框,使用户可以选择要在其中安装应用程序的目录
  • --win-menu —将应用程序添加到系统菜单
  • --win-menu-group <menu-group-name> —放置此应用程序的开始菜单组
  • --win-per-user-install —按用户安装应用程序
  • --win-shortcut —为应用程序创建桌面快捷方式
  • --win-upgrade-uuid <string> —与该软件包的升级相关联的UUID
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部