17

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

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

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

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

4

3 回答 3

12

链接

是的,使用jlink( JEP 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/jmods)和您的应用程序模块(mods
  • --add-modules命名您希望运行时映像包含的模块 - 包括其所有(它们的)传递依赖项
  • --launcher是可选的,但非常方便;.bat它使用给定的名称 ( )创建一个特定于操作系统的启动器(例如 Windows 上的 a ),launch-app该启动器启动指定的模块(your.app;在这种情况下,假设为它定义了主类)
  • --output指定在哪里创建运行时映像
于 2017-10-21T07:18:04.663 回答
8

包:

作为一个编辑(在评论中指出),javapackager在 Java-10 中从 JDK 中删除,人们可以期待jpackage自 Java-14 以来将其用作孵化工具。

打包程序

你可以使用javapackager工具。

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

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

尽管与构建这些应用程序相关的某些限制javapackager包括 -

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

  • 自包含的应用程序包必须建立在它打算运行的操作系统上。先决条件工具必须可用以构建特定格式的包。

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


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

<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"
于 2017-10-22T02:24:58.727 回答
0

这对我有用。它在应用程序文件夹中包含 JRE 并创建一个可执行文件。我在 src 文件夹中有我的文件 java 文件,这个命令编译并创建了一个带有可执行文件的 dist 文件夹。

javapackager -makeall -name WordAnalyzer_app -appclass queue.Gui
pause
于 2020-10-16T07:03:14.843 回答