基于jdk17 + javaFX17 , 写一个简单的桌面程序,用Jlink生成运行时环境,再用Jpackage打包成exe可执行文件。
环境
windows
下载安装jdk17,并配置系统路径PATH。java 17 支持和非模块化,此处使用模块化方式。
下载安装javaFX17,并配置系统路径PATH
写一个简单的JavaFX窗口
在文件夹E:\Projects\java下新建一个目录JpackageDemo
新建文件夹 src/hellofx
在文件夹hellofx里新建两个文件。
项目结构为:
JpackageDemo->
src->
HelloFX.java
package hellofx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javaFxVersion = System.getProperty("javafx.version");
Label l = new Label("xxxHello, JavaFX" + javaFxVersion + ", running on java" + javaVersion);
Scene scene = new Scene(new StackPane(l), 640, 480);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args){
launch();
}
}
module-info.java
module hellofx {
requires javafx.controls;
exports hellofx;
}
在项目文件夹 E:\Projects\java\JpackageDemo> 下执行命令 (后续都在这个文件夹下执行命令) :
javac --module-path 'E:\Java\javafx-sdk-17.0.11\lib' --add-modules javafx.controls -d mods .\src\hellofx\HelloFX.java .\src\hellofx\module-info.java
此时文件夹下生成mods文件,里面包含class文件。
运行此项目:
java --module-path 'mods;E:\Java\javafx-sdk-17.0.11\lib' --add-modules javafx.controls,javafx.fxml -m hellofx/hellofx.HelloFX
运行效果:
使用Jlink生成运行时环境
使用 jlink 工具创建自定义的JRE环境,将mods和一些javafx模块编译进去,生成的custom-runtime文件夹就是我们自定义的JRE环境,这个自定义 JRE 包含了我们指定的模块(lib/modules里)以及必要的 Java 运行时组件。可与windows系统下安装的JRE做个对比,精简了200M左右 (不仅jmods文件下的模块没有了,还少了很多其他dll)。
jlink --module-path "E:\Java\javafx-sdk-17.0.11\lib;mods" --add-modules hellofx,javafx.controls,javafx.graphics --output custom-runtime
进入custom-runtime/bin目录,运行程序:
cd custom-runtime/bin
./java -m hellofx/hellofx.HelloFX
可以出现执行窗口:()
我们也可以把这个精简的jre环境写进Docker里,精简Docker镜像大小
使用Jpackage打包成exe
需要安装WIX
如果没有使用 Jlink 生成jre,Jpackage会悄悄使用 Jlink 帮你生成JRE。
会在output/MyApp文件夹下生成一个可执行文件MyApp.exe。
jpackage --runtime-image custom-runtime
--name MyApp
--module hellofx/hellofx.HelloFX
--dest output
--type app-image # --type exe 会生成一个安装exe文件
点击MyApp.exe即可执行程序。
大多数情况下,直接分发MyApp.exe文件即可。
如果想更精简,可使用GraalVM 的 Native Image工具将Java 程序编译为本地可执行文件(Native Executable)。
GraalVM 的 Native Image 是一个功能强大的工具,可以将 Java 应用程序编译成本地可执行文件,而不需要依赖于 JVM。这种方式可以显著减少应用程序的启动时间和内存占用,并且生成的可执行文件可以直接运行,而无需安装 Java 运行时环境。
Tips:
由于JMS (Java Module System) 按顺序加载模块,使用Idea时,确保手动编译的文件位于out目录(Idea编译后的目录)下面,否则直接使用Idea Run 项目会运行失败。如下,out1是我们手动编译后的字节码文件夹。