自包含的应用程序

Jac*_* G. 13 java self-contained java-9 java-module

我已经看过几篇在Java 9中简要提到自包含应用程序的在线演示文稿,但我有一个问题需要我解决.

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

我怀疑它是后者,因为下载最新版Java 的页面(这里)仍显示版本8_151.

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

Nic*_*lai 11

是的,这是可能jlink,但是您的所有代码依赖项都需要是模块化JAR(即带有的module-info.class).它的工作原理如下:

jlink
    --module-path $JAVA_HOME/jmods:mods
    --add-modules your.app
    --launcher launch-app=your.app
    --output your-app-image
Run Code Online (Sandbox Code Playgroud)

详细地:

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

  • 根据新的[`javapackager`](https://docs.oracle.com/javase/9​​/deploy/self-contained-application-packaging.htm#JSDPG583)页面,它在内部使用`jlink`.因此,对于具有可执行文件的真正自包含应用程序,请使用javapackager. (4认同)
  • 最近的版本(即 Java 14+),用名为 [jpackage](https://openjdk.java.net/jeps/392) 的新工具替换了此问题评论中提到的 javapackager 工具,该工具“支持本机打包格式以提供最终用户自然的安装体验”,与 jlink 不同,它支持模块化和非模块化应用程序的打包。 (2认同)

Nam*_*man 7

或者,您可以使用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.


创建基本自包含应用程序的一种方法是修改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>
Run Code Online (Sandbox Code Playgroud)

可以使用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"
Run Code Online (Sandbox Code Playgroud)