java - jpackage 似乎打包了不应该打包的东西

标签 java jlink jpackage

我正在尝试使用 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/

相关文章:

java - jlink:服务绑定(bind)链接了许多不必要的模块

java - 使用 Jlink 在一个平台上为另一个平台创建 Java 运行时镜像

java - jpackage pkg codesign -- appstore 提交错误

java - JPackage在创建DMG之前将文件复制到应用程序的Resource文件夹中

java - 无法通过 ToolProvider 找到 jpackage

java - Spring Boot 不会替换 Spring Tool Suite 版本 : 3. 8.4.RELEASE 中的系统变量 {user.home}

java - BorderLayout 重复按钮

java - 我的任务是创建一个 Java 应用程序,该应用程序使用 2 个同步线程来计算每月利息并更新帐户余额

java - 使用 deps 从旧 JAR 创建模块化 JAR

java - 这种方法会使sha256更难破解吗?