我正在尝试使用 jpackage 创建一个相对较小的程序的 native 安装程序。创建的应用程序镜像大小约为 120 MB。这很奇怪,因为我之前使用过 jlink 并且运行时镜像只有 ~40 MB。经过一番挖掘,我在我的应用程序镜像中发现了 runtime/lib/modules
,这是一个大小为 90 MB 的文件。由于 runtime/legal
列出了很多我不使用的东西(模块?),我认为 jpackage 打包了它不应该打包的东西,但我不确定。
注意:该程序不应是模块化的。我的理解是,这仅在制作多部分程序或库时才有用。我使用 eclipse 自动创建的 module-info.java 来“欺骗”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 选项 [--add-modules] 不允许在 -- jlink-选项
最佳答案
JPackage 会自动使用 jlink 来构建 JRE,并且这些模块最终会出现在该模块文件中。如果您的 jar 不是模块化的,那么 jpackage 将添加所有内容,除非您设置 --add-modules
。否则,检查 module-info.java
仅包含运行时的必需内容,而不包含任何测试代码依赖项。我使用过的某些版本的 Eclipse 非常热衷于将 JUNIT 测试库添加到 module-info.java 中,而部署发布目录中不需要这些库。 Eclipse 应该为 src + 测试代码设置单独的构建目录。
但是,独立使用 jlink
是有好处的,因为您可以在使用 jpackage 之前使用 JRE 测试您的代码库 - 如果您的 JDK 依赖项没有更改之前的,这可以节省大量时间>jlink
JRE已经准备好了。
此外,jlink 命令行支持附加标志以进一步缩小 JRE 大小:
jlink --strip-debug --no-man-pages --no-header-files --compress=1 --add-modules blah,blah --output myjre
关于java - jpackage 似乎打包了不应该打包的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69514293/