自包含应用程序,内置 Java
Self-Contained Applications, built in Java
我在 Java 9 中观看了一些简要提及自包含应用程序的在线演示,但我有一个问题需要解决。
使用新的模块系统,您现在可以只包含 运行 您的应用程序所需的最少代码量。但是,希望 运行 应用程序的系统是否仍然需要 JRE,或者是可以包含在程序中的基本模块中的东西?
我怀疑是后者,因为下载 Java 最新版本的页面 (here) 仍然显示版本 8_151.
TL;DR - 使用 Java 9,是否可以创建一个独立的可执行文件,可以在没有安装 JRE/Java 的系统上执行?
jlink
是的,这是可能的 with 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
是可选的,但非常方便;它创建一个特定于 OS 的启动器(例如 Windows 上的 .bat
),并使用给定的名称 (launch-app
) 启动指定的模块(your.app
;在这种情况假设为其定义了主要 class)
--output
指定创建运行时映像的位置
jpackage:
作为一项编辑(在评论中指出),javapackager
已从 Java-10 中的 JDK 中删除,可以期待使用 jpackage
作为自 Java-14 以来的孵化工具。
javapackager
您可以使用javapackager
工具。
The Java packaging tools provide built-in support for several formats
of self-contained application packages.
The basic package is a single
folder on your hard drive that includes all application resources and
the JRE. The package can be redistributed as is, or you can build an
installable package (for example, EXE or DMG format.)
尽管使用 javapackager
构建这些应用程序存在某些限制,其中包括 -
必须通过将本机参数传递给 Ant 任务或 javapackager -deploy 命令来显式请求自包含应用程序包。
独立的应用程序包必须构建在预期运行的操作系统上。必备工具必须可用才能以特定格式构建包。
独立的应用程序包只能使用 JDK 7 Update 6 或更高版本构建。 Java JDK 9 的打包程序使用 JDK 9 运行time 图像打包应用程序。要将 JDK 8 或 JDK 7 JRE 与您的应用程序打包,请使用 JDK 8 Java Packager.
创建基本独立应用程序的一种方法是修改 deploy
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 用于生成自包含应用程序包的打包程序命令类似于 -
javapackager -deploy -native -outdir OUTPUT_DIR -outfile APPLICATION_NAME
-srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
-name "YourApplication" -title "SelfContained"
这对我有用。
它在应用程序文件夹中包含 JRE 并创建一个可执行文件。
我在 src 文件夹中有我的文件 java 文件,这个命令编译并创建了一个带有可执行文件的 dist 文件夹。
javapackager -makeall -name WordAnalyzer_app -appclass queue.Gui
pause
我在 Java 9 中观看了一些简要提及自包含应用程序的在线演示,但我有一个问题需要解决。
使用新的模块系统,您现在可以只包含 运行 您的应用程序所需的最少代码量。但是,希望 运行 应用程序的系统是否仍然需要 JRE,或者是可以包含在程序中的基本模块中的东西?
我怀疑是后者,因为下载 Java 最新版本的页面 (here) 仍然显示版本 8_151.
TL;DR - 使用 Java 9,是否可以创建一个独立的可执行文件,可以在没有安装 JRE/Java 的系统上执行?
jlink
是的,这是可能的 with 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
是可选的,但非常方便;它创建一个特定于 OS 的启动器(例如 Windows 上的.bat
),并使用给定的名称 (launch-app
) 启动指定的模块(your.app
;在这种情况假设为其定义了主要 class)--output
指定创建运行时映像的位置
jpackage:
作为一项编辑(在评论中指出),javapackager
已从 Java-10 中的 JDK 中删除,可以期待使用 jpackage
作为自 Java-14 以来的孵化工具。
javapackager
您可以使用javapackager
工具。
The Java packaging tools provide built-in support for several formats of self-contained application packages.
The basic package is a single folder on your hard drive that includes all application resources and the JRE. The package can be redistributed as is, or you can build an installable package (for example, EXE or DMG format.)
尽管使用 javapackager
构建这些应用程序存在某些限制,其中包括 -
必须通过将本机参数传递给 Ant 任务或 javapackager -deploy 命令来显式请求自包含应用程序包。
独立的应用程序包必须构建在预期运行的操作系统上。必备工具必须可用才能以特定格式构建包。
独立的应用程序包只能使用 JDK 7 Update 6 或更高版本构建。 Java JDK 9 的打包程序使用 JDK 9 运行time 图像打包应用程序。要将 JDK 8 或 JDK 7 JRE 与您的应用程序打包,请使用 JDK 8 Java Packager.
创建基本独立应用程序的一种方法是修改 deploy
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 用于生成自包含应用程序包的打包程序命令类似于 -
javapackager -deploy -native -outdir OUTPUT_DIR -outfile APPLICATION_NAME
-srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
-name "YourApplication" -title "SelfContained"
这对我有用。 它在应用程序文件夹中包含 JRE 并创建一个可执行文件。 我在 src 文件夹中有我的文件 java 文件,这个命令编译并创建了一个带有可执行文件的 dist 文件夹。
javapackager -makeall -name WordAnalyzer_app -appclass queue.Gui
pause