我已经看过几篇在Java 9中简要提到自包含应用程序的在线演示文稿,但我有一个问题需要我解决。
使用新模块系统,您现在只允许包含运行应用程序所需的最少代码。但是,希望运行应用程序的系统是否仍需要JRE,或者是否可以包含在程序中的基本模块中?
我怀疑它是后者,因为下载最新版Java的页面(here)仍显示版本8_151。
TL; DR - 使用Java 9,是否可以创建一个可以在没有安装JRE / Java的系统上执行的自包含可执行文件?
是的,这可能是with jlink
(JEP 282),但是你的所有代码和你的依赖都需要是模块化的JAR(即带有module-info.class
的JAR)。它的工作原理如下:
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
是可选的,但非常方便;它创建了一个特定于操作系统的启动器(例如Windows上的.bat
),它具有给定名称(launch-app
),用于启动指定的模块(your.app
;在这种情况下,假设为其定义了主类)--output
指定创建运行时映像的位置或者,您可以使用javapackager
工具(JEP 343)。
Java打包工具为多种自包含应用程序包提供内置支持。
基本软件包是硬盘驱动器上的一个文件夹,包含所有应用程序资源和JRE。可以按原样重新分发程序包,也可以构建可安装程序包(例如,EXE或DMG格式)。
尽管使用javapackager
构建这些应用程序存在某些限制,其中包括 -
创建基本自包含应用程序的一种方法是修改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 Packager命令将类似于 -
javapackager -deploy -native -outdir OUTPUT_DIR -outfile APPLICATION_NAME
-srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
-name "YourApplication" -title "SelfContained"