自包含应用程序,内置于 Java 中金林克

2022-09-02 10:19:02

我看过一些在线演示,其中简要提到了Java 9中的自包含应用程序,但我有一个问题,我想澄清一下。

使用新的模块系统,您现在只需包含运行应用程序所需的最少代码量。但是,希望运行应用程序的系统是否仍然需要 JRE,或者是否可以包含在程序的基本模块中?

我怀疑是后者,因为下载最新版本Java的页面(此处)仍然显示版本8_151。

TL;DR - 使用Java 9,是否可以创建一个可以在没有安装JRE / Java的系统上执行的独立可执行文件?


答案 1

金林克

是的,这可以通过 jlinkJEP 282) 实现,但是您的所有代码依赖项都需要是模块化 JAR(即带有 )。它的工作原理如下:module-info.class

jlink
    --module-path $JAVA_HOME/jmods:mods
    --add-modules your.app
    --launcher launch-app=your.app
    --output your-app-image

详细地:

  • --module-path列出了包含模块的文件夹 - 这需要包括要使用的 JDK 附带的平台模块(在 中)和应用程序模块 ($JAVA_HOME/jmodsmods)
  • --add-modules命名您希望运行时映像包含的模块 - 包括其所有(它们的)传递依赖项
  • --launcher是可选的,但非常方便;它创建一个特定于操作系统的启动器(例如Windows上的一个),其名称为()启动指定的模块(;在这种情况下,假设为它定义了主类).batlaunch-appyour.app
  • --output指定创建运行时映像的位置

答案 2

jpackage:

作为编辑(在注释中指出),在Java-10中从JDK中删除,人们可以期待从Java-14开始使用jpackage作为孵化工具。javapackager

javapackager

您可以使用javapackager工具。

Java 打包工具为多种格式的独立应用程序包提供内置支持。

基本包是硬盘驱动器上的单个文件夹,其中包含所有应用程序资源和 JRE。可以按原样重新分发包,也可以生成可安装的包(例如,EXE 或 DMG 格式)。

尽管在构建这些应用程序时存在某些限制,但包括 :javapackager

  • 必须通过将本机参数传递给 Ant 任务或 javapackager -deploy 命令来显式请求自包含应用程序包。

  • 独立应用程序包必须在要运行它的操作系统上生成。必须提供必备工具才能以特定格式生成包。

  • 自包含应用程序包只能使用 JDK 7 Update 6 或更高版本构建。Java Packager for JDK 9 使用 JDK 9 运行时映像打包应用程序。要将 JDK 8 或 JDK 7 JRE 与应用程序打包在一起,请使用 JDK 8 Java Packager


创建基本自包含应用程序的一种方法是修改部署 ant 任务:

<fx:deploy width="${javafx.run.width}" height="${javafx.run.height}"
           nativeBundles="all"
           outdir="${basedir}/${dist.dir}" outfile="${application.title}">
    <fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
    <fx:resources>
        <fx:fileset dir="${basedir}/${dist.dir}" includes="*.jar"/>
    </fx:resources>
    <fx:info title="${application.title}" vendor="${application.vendor}"/>
</fx:deploy>

可以使用 javapackager 命令工具构建本机包。用于生成自包含应用程序包的 Java Packager 命令将如下所示 -

javapackager -deploy -native -outdir OUTPUT_DIR -outfile APPLICATION_NAME 
    -srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
    -name "YourApplication" -title "SelfContained"

推荐