​​​​​​​使用jlink +jpackage生成本地本机可执行Java程序或镜像


将jlink和jpackage一起使用可以交付打包好的直接执行的Java应用程序,可以在不依赖最终用户安装特定 JDK 的情况下做到这一点,因为jlink在您的应用程序安装程序中为他们提供了他们需要的 JDK 子集。
 
使用 jlink 创建纤薄的自定义运行时runtime
如果您今天下载 JDK,它大约有 300 兆字节,其中一半实际上是两次完全相同的数据。因为 JDK 包含以两种不同方式打包的模块:

  • 第一,作为包含程序实际运行数据的链接版本,
  • 第二,作为独立模块。如果您在应用程序中包含 JDK,那么您包含的位比实际需要的要多得多。

使用jlink,您可以创建仅包含您的应用程序需要的自定义运行时。所以,如果你有一个小型应用程序,也许你只需要平台中 60 多个模块中的一小部分,如果你有容器环境,你正在构建一个 Docker 镜像并希望它保持纤薄和小巧,这尤其有用。
另一件需要了解的事情jlink是,通过使用 JVM 中内置的类数据共享,您可以预先计算一些状态并将其存储在 HotSpot JVM 的类数据共享 (CDS) 存档中。因此,您进行一次试验运行,将该数据存储到磁盘,然后,在后续运行中,您可以重复使用该训练数据,这为您的应用程序提供了更快的启动时间和更小的内存占用。如果您在同一台机器上运行多个进程,这尤其有用。
最后,应用程序无需知道模块即可使用此工具:您可以使用jlink1990 年代的旧 Java 应用程序,一切都会正常运行。
如果使用jlink,则需要确保使用最新更新来更新自定义运行时镜像/映像。与自定义运行时映像不同,Web 部署的 Java 应用程序会在应用程序更新可用时使用Java Auto Update 自动从 Internet 下载应用程序更新。但是,jlink的自定义运行时映像没有对自动更新的内置支持。
  
使用jpackage绑定
使用jpackage绑定一个Java应用程序或Java运行时到一个Docker镜像,包括所有必要的依赖,产生的结果是:操作系统特定格式的本机包,例如.exe适用于 Windows 的.dmg文件或适用于 macOS的文件。
与jlink结合使用时,jpackage可为您提供完整的端到端部署系统。
 
案例源码