自Java 9开始,JDK增加了模块系统,把JavaFX分离了出来。不过即使分离出来,JavaFX也还是属于JDK的一个插件。这种插件有两种用法,一是在JDK外部安装,通过java命令导入,二是嵌入JDK中,把JDK扩展成自带JavaFX的版本。
外部安装的方法需要使用以下格式启动JAR
java -Dfile.encoding="UTF-8" --module-path "D:\lab\java\Library\lib\jar\openjfx-13.0.1_windows-x64_bin-sdk\javafx-sdk-13.0.1\lib" --add-modules "javafx.controls,javafx.fxml,javafx.web" -jar "scenebuilder-8.5.0-all.jar"
但我发现在Eclipse中配置了--module-path和--add-modules参数后,这个参数会在若干次更新后消失,变成不需要这个参数也能执行。但新的Java工程仍然需要设置,尽管过一段时间它会自动消失且不影响使用。将bin文件夹复制出来,并复制eclipse中的启动命令到bat文件中启动bin时,也不需要--module-path和--add-modules。但封装成jar以后就需要了。
比较方便的方法是还JDK本色,把JavaFX重新嵌入到JDK中。我是建议把JavaFX嵌入JDK中。
方法是在JavaFX Gluon下载对应版本的JavaFX和SDK和JMOD。
解压后,把jmod压缩包里面得到的jmod文件夹与jdk安装目录下的jmod文件夹合并。且把sdk压缩包里面的bin、legal、lib分别与jdk安装目录下的同名文件夹合并。其中,JavaFX SDK与JDK的bin中有重复的文件,我选择不覆盖。其实是一样的文件,为了减少对硬盘的读写,我选择不覆盖。如果选择覆盖也是可以的。
将JavaFX的SDK与jmod合并到JDK以后,就不再需要--modult-path和--add-modules参数了。启动命令就变成:
java -Dfile.encoding="UTF-8" -jar "scenebuilder-8.5.0-all.jar"
有时候这个方法也不灵,这时需要再增加一个脚本
::把要用的模块放入JDK后运行
path "java 11+/bin";%PATH
jlink --module-path "C:\Program Files\Java\jdk" --add-modules java.base,java.compiler,java.datatransfer,java.xml,java.prefs,java.desktop,java.instrument,java.logging,java.management,java.security.sasl,java.naming,java.rmi,java.management.rmi,java.net.http,java.scripting,java.security.jgss,java.transaction.xa,java.sql,java.sql.rowset,java.xml.crypto,java.se,java.smartcardio,jdk.accessibility,jdk.internal.vm.ci,jdk.management,jdk.unsupported,jdk.internal.vm.compiler,jdk.aot,jdk.internal.jvmstat,jdk.attach,jdk.charsets,jdk.compiler,jdk.crypto.ec,jdk.crypto.cryptoki,jdk.crypto.mscapi,jdk.dynalink,jdk.internal.ed,jdk.editpad,jdk.hotspot.agent,jdk.httpserver,jdk.incubator.foreign,jdk.internal.opt,jdk.jdeps,jdk.jlink,jdk.incubator.jpackage,jdk.internal.le,jdk.internal.vm.compiler.management,jdk.jartool,jdk.javadoc,jdk.jcmd,jdk.management.agent,jdk.jconsole,jdk.jdwp.agent,jdk.jdi,jdk.jfr,jdk.jshell,jdk.jsobject,jdk.jstatd,jdk.localedata,jdk.management.jfr,jdk.naming.dns,jdk.naming.rmi,jdk.net,jdk.nio.mapmode,jdk.rmic,jdk.scripting.nashorn,jdk.scripting.nashorn.shell,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported.desktop,jdk.xml.dom,jdk.zipfs,javafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web --output new_jre
pause
运行这个脚本后,会生成一个new_jre文件夹。如果已经配置了java11以上的版本的环境变量,则不需要在脚本中调用path。 可以在任意的文件夹运行,将生成的new_jre里面的东西覆盖原有的jdk或者直接把环境变量改过来就可以使用了。
如果不需要指定字符集,且系统中设置默认启动jar的程序为javaw时,也可以双击打开。
另外,如果是用JavaFX做桌面开发,建议配套Oracle上下载的SceneBuilder2.0,不要使用Gluon上下载的SceneBuilder8.5和SceneBuilder11.0.0。Gluon版本的SceneBuilder不支持中文路径,还有一些Bug,已经几年了也没有修复。