【问题标题】:jpackage seems to pack things it shouldn'tjpackage 似乎打包了它不应该打包的东西
【发布时间】:2021-11-29 12:01:42
【问题描述】:

我正在尝试为一个相对较小的程序创建一个使用 jpackage 的本机安装程序。创建的应用映像大小约为 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 option [--add-modules] is not permitted in --jlink-options

【问题讨论】:

  • FWIW,要找出运行时包含哪些模块,您可以使用runtime/bin/java --list-modules
  • 谢谢,我不知道那个!

标签: java jlink jpackage


【解决方案1】:

JPackage 确实会自动使用 jlink 来构建 JRE,并且这些模块最终会出现在该模块文件中。如果您的 jar 不是模块化的,那么 jpackage 将添加所有内容,除非您设置 --add-modules。否则请检查 module-info.javaonly 包含运行时的必需品,而不是任何测试代码依赖项。我使用的一些 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

【讨论】:

  • 我没有module-info.java,因为我想“如果我可以指定一个非模块化程序 jpackage 可能会产生一些魔力,只打包需要的东西”......似乎它没有t,它只是打包了所有东西。好像我不得不再次弄乱模块:(
  • 对您的答案的补充:jpackage 默认使用 --strip-debug、--no-header-files、--no-man-pages 和 --strip-native-commands 运行 jlink .
  • @mindoverflow 谢谢,我会在我自己的应用程序上尝试--strip-native-commands
【解决方案2】:

看看这个教程。 https://github.com/dlemmermann/JPackageScriptFX 它也主要是为 JavaFX 制作的,但基本原则是通用的,对您有帮助。它将 jlink 阶段与 jpackage 阶段分开,从而可以完全避免模块系统,但仍然能够构建缩减的运行时映像。

【讨论】:

  • 非常有趣,因为它使用了 maven,就像我的项目一样。我发现了类似的东西 (github.com/wiverson/maven-jpackage-template),我已经对其进行了修改以执行两次 jpackage 运行。不过,这仍然是一件好事。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多