java11及以上版本运行javafx程序
高版本的java不再自带javafx,需要自己添加路径,如果是java8的话直接可以使用。
本文分为两个部分:第一部分介绍如何运行javafx程序,第二部分介绍如何打包一个包含了javafx的jre环境。
运行javafx程序
下载openjfx
https://gluonhq.com/products/javafx/
openjfx的LTS版本好像要付费才能下载,所以勾选“Include older versions”下载一个非LTS的。
下载后解压到一个地方,我解压到了D:\软件\Java\jfx\javafx-sdk-17
执行jar文件时按如下命令执行
java --module-path "D:\软件\Java\jfx\javafx-sdk-17\lib" --add-modules javafx.controls -jar mcaselector-2.1.jar
注意替换自己的解压路径和程序名称。
自己打包一个包含javafx的jre
下载并解压javafx-17-jmods,我在D:\软件\Java\jfx\javafx-jmods-17
注意区分jmods和上一步用的sdk!
使用jdk-17的java执行:
java --module-path "D:\软件\Java\jfx\javafx-sdk-17\lib" --list-modules
会输出一堆modules,待会创建一个包含了这些所有modules的jre,当然你也可以精简一些,只保留你需要的。
然后打包jre,
打包jre的命令语法:
jlink --module-path <javafx-path\lib> --add-modules <module1[,module2[, ...]]> --output <output-path>
所以我这里就是执行:
jlink --module-path "D:\软件\Java\jfx\javafx-jmods-17" --add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.se,java.security.jgss,java.security.sasl,java.smartcardio,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,jdk.accessibility,jdk.charsets,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.crypto.mscapi,jdk.dynalink,jdk.httpserver,jdk.incubator.foreign,jdk.incubator.vector,jdk.internal.vm.ci,jdk.internal.vm.compiler,jdk.internal.vm.compiler.management,jdk.jdwp.agent,jdk.jfr,jdk.jsobject,jdk.localedata,jdk.management,jdk.management.agent,jdk.management.jfr,jdk.naming.dns,jdk.naming.rmi,jdk.net,jdk.nio.mapmode,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported,jdk.xml.dom,jdk.zipfs,javafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web --output C:\Users\Jcun\Desktop\myjre17
javafx.swt无法被添加,看了一下是因为javafx.swt.jar中没有module-info.class,所以无法被识别为一个模块,就先不添加了。
这样打包出的jre就可以直接运行javafx的程序了。