首页 > 解决方案 > jpackage 似乎打包了它不应该打包的东西

问题描述

我正在尝试使用 jpackage 为相对较小的程序创建本机安装程序。创建的应用映像大小约为 120 MB。这很奇怪,因为我之前使用过 jlink,而运行时映像过去只有 ~40 MB。经过一番挖掘,我runtime/lib/modules在我的应用图像中发现了一个 90 MB 大小的文件。由于runtime/legal列出了很多我不使用的东西(模块?),我认为 jpackage 包含了它不应该包含的东西,但我不确定。

注意:该程序不应该是模块化的。我的理解是,这仅在制作多部分程序或库时才有用。我使用了module-info.java由 eclipse 自动创建的,好吧,“欺骗” jlink 来创建运行时映像。

这是我用来创建应用程序图像的参数。

--type app-image
--name myapp
--dest target\appimg
--temp target\appimg-work
--input target\jar
--icon .\icon.ico
--main-jar target\jar\myapp.jar
--main-class com.msgprograms.myapp.AppMain

将一些文件复制到应用程序映像后,我使用另一个 jpackage 运行创建安装程序,这次使用这些参数:

--type msi
--app-version 0.0.1
--copyright "(C) msgprograms"
--description "some app"
--name myapp
--dest target
--temp target\installer-work
--vendor msg-programs
--app-image target\appimg\myapp
// omitted windows-specific args

为什么应用程序图像如此之大,我如何使其更小?除了再次使程序模块化,使用 jlink 创建运行时映像然后将其提供给 jpackage 之外,还有其他方法吗?

编辑:
我忘了提到该应用程序不使用 JavaFX。我在 jpackage 上找到的所有文章都可以,因此它们的帮助有限。

编辑2:
试图通过做来变得聪明是--jlinkoptions "--add-modules java.desktop"行不通的,因为jlink option [--add-modules] is not permitted in --jlink-options

标签: javajlinkjpackage

解决方案


JPackage 确实会自动使用 jlink 来构建 JRE,并且这些模块最终会出现在该模块文件中。如果您的 jar 不是模块化的,那么 jpackage 将添加所有内容,除非您设置--add-modules. 否则,检查module-info.java仅包含运行时的必需品,而不包含任何测试代码依赖项。我使用的一些 Eclipse 版本非常热衷于添加module-info.java部署发布目录中不需要的 JUNIT 测试库。Eclipse 应该为 src + 测试代码设置单独的构建目录。

但是,jlink独立使用有好处,因为您可以在使用 jpackage 之前使用 JRE 测试您的代码库 - 这可以节省大量时间,并且如果您的 JDK 依赖项没有更改,则之前的jlinkJRE 已经准备好。

此外,jlink 命令行支持添加标志以进一步减少 JRE 大小:

jlink --strip-debug --no-man-pages --no-header-files --compress=1 --add-modules blah,blah  --output myjre

推荐阅读