标签搜索

使用 jdeps 和 jlink 打包可独立运行的 Java 应用程序

HackTech.top
2023-05-08 / 0 评论 / 198 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年05月09日,已超过593天没有更新,若内容或图片失效,请留言反馈。

如果你使用 Java 编写 GUI 程序,你可能会发现在客户端部署时需要依赖大量的 JRE 和第三方库。在没有打包工具之前,这可能是一个很大的问题。但是现在 JDK14 和 JDK15 已经提供了一个名为 jlink 的孵化阶段工具,它可以用于创建用于打包独立 Java 应用程序的工具。

以下是如何使用 jdeps 和 jlink 打包可独立运行的 Java 应用程序的步骤:

  1. 使用 jdeps 工具检查 jar 包的依赖项,例如:
jdeps C:\pathto\myjar.jar

如果你使用了 JavaFX,(JavaFX 在 JDK11 之后被分离出来),你需要指定第三方模块的路径,否则会报错:

jdeps --module-path C:\JDK\openjfx\javafx-sdk-15.0.1\lib --add-modules javafx.base C:\pathto\myjar.jar

你可以查看到依赖项,主要关注右侧的模块,例如 java.base,java.desktop 等等。

  1. 使用 jlink 工具导出模块。通常情况下,只需导出常用的模块即可,建议出现在右边的全部导出。示例命令如下:
jlink --strip-debug --compress 1 --no-header-files --no-man-pages --output miniJre --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop,java.sql,jdk.charsets,java.net.http,jdk.xml.dom,jdk.jsobject,jdk.jfr,jdk.net,java.rmi,jdk.crypto.ec,jdk.nio.mapmode

其中比较重要的模块是 java.base、java.logging、java.naming、java.xml、jdk.sctp、jdk.unsupported、java.desktop。如果你的程序用到了 HTTPS,请导出 jdk.crypto.ec。如果你用到了 Java.net.http 和 jdk.net,也建议导出。

  1. 编写批处理脚本,使用相对路径的 JRE 运行。你可以在当前文件夹下找到一个名为 miniJre 的文件夹,这就是你导出的 JRE。你可以删除其中的 legal 文件夹,但是不能删除 conf 和 lib。你可以将你的 jar 包复制到这个文件夹中,然后编写批处理脚本来运行。以下是一个示例批处理脚本:
start /b %~dp0bin\javaw.exe -splash:images/center/loading.gif -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Dfile.encoding=utf-8 cn.gxust.MainRunApp

其中:

  • splash 是指定启动 Java 程序时的启动动画,这里用了一个 gif 图片作为启动动画,如果不需要可以删除;
  • XX:+UnlockExperimentalVMOptions -XX:+UseZGC 这两个参数是启用 JDK14 和 JDK15 新特性的 ZGC 垃圾回收器,这个新 GC 比 CMS 强,回收效率更高,减少了 JavaFX 程序运行所需的内存,如果不需要可以删除;
  • Dfile.encoding=utf-8 指定使用 UTF-8 编码,如果不需要可以删除;
    cn.gxust.MainRunApp 是指定要运行的主类,需要根据实际情况修改。
  • 最后程序的结构:

bin、lib、conf 是 JRE 的主体,总共占用 52.3MB;
最终文件夹的大小为 94.4MB,其中因为加了 JavaFX 依赖、第三方库、大量图片等导致 jar 包占据了 45MB。

  1. 打包 Java 程序
    最后把这个整个文件夹用innosetup打包成安装包就行了。
3

评论 (0)

取消