java - 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
解决方案
JPackage 确实会自动使用 jlink 来构建 JRE,并且这些模块最终会出现在该模块文件中。如果您的 jar 不是模块化的,那么 jpackage 将添加所有内容,除非您设置--add-modules
. 否则,检查module-info.java
仅包含运行时的必需品,而不包含任何测试代码依赖项。我使用的一些 Eclipse 版本非常热衷于添加module-info.java
部署发布目录中不需要的 JUNIT 测试库。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
推荐阅读
- php - 下载 PHP 而不是运行
- android - 新的
- python - Pandas 循环中的多个正则表达式替换
- cytoscape.js - cystoscape 中的顺序边缘动画
- mysql - 这个查询慢吗
- javascript - render_template 不呈现 POST 请求中指定的模板
- mod-auth-openidc - 取消保护特定
当整个站点受到 mod-auth-openidc 保护时 - c# - 为什么我的 2D 子弹的对撞机没有碰撞到任何东西?
- php - 为什么 Laravel 的重置密码功能使用数据库,而电子邮件验证使用签名路由?
- docker - 为什么我不能将容器附加到 docker 网络?