JavaFX项目导出可运行Jar后执行报错:JavaFX runtime components are missing
JavaFX项目导出可运行Jar后执行报错:JavaFX runtime components are missing
Hey,我之前也遇到过一模一样的问题!从Java 11开始JavaFX就从JDK里剥离出来了,你直接导出的普通可运行Jar没办法自动包含JavaFX的运行时组件,运行自然就报错了。给你几个解决方案,从临时应急到永久打包都有:
临时应急:手动指定JavaFX运行时运行Jar
如果只是临时想让Jar能跑起来,你可以在终端运行的时候手动指定JavaFX的模块路径和所需模块。假设你的JavaFX SDK放在~/javafx-sdk-19这个路径下,运行命令如下:
java --module-path ~/javafx-sdk-19/lib --add-modules javafx.controls,javafx.fxml -jar filename.jar
- 记得把
~/javafx-sdk-19替换成你自己的JavaFX SDK实际路径 - 如果你的项目用到了其他JavaFX模块(比如
javafx.web、javafx.media),把它们也加到--add-modules后面,用逗号分隔
永久解决:打包成包含JavaFX运行时的原生应用(推荐给教授)
要让教授不用折腾JavaFX环境,最好打包成Mac上的.app原生应用,用JDK自带的jpackage工具就能搞定,步骤如下:
- 先确保你已经导出了项目的Jar包(不管是Runnable Jar还是普通Jar都可以)
- 打开终端,找到
jpackage的路径(Java 18的话一般在/Library/Java/JavaVirtualMachines/jdk-18.jdk/Contents/Home/bin),或者直接把这个路径加到环境变量里 - 运行下面的命令(替换成你自己的路径和参数):
jpackage --type app-image \ --input /path/to/your/jar/file/directory \ --main-jar filename.jar \ --module-path /path/to/javafx-sdk-19/lib \ --add-modules javafx.controls,javafx.fxml \ --name YourProjectName
运行完之后,你会得到一个YourProjectName.app的应用程序,直接发给教授,他双击就能打开,完全不需要装Java或者JavaFX!
Eclipse里的正确导出方式(用插件或Maven)
如果你习惯用Eclipse操作,可以试试这两种方法:
- 用e(fx)clipse插件:如果你装了专门的JavaFX Eclipse插件,它自带了打包功能,能帮你自动处理JavaFX的依赖,导出包含运行时的可执行包
- 用Maven/Gradle插件:把项目改成Maven项目,添加
javafx-maven-plugin,配置好模块和SDK路径后,执行mvn javafx:package命令,就能生成可运行的Jar或者原生镜像,比手动导出靠谱多了
最后说下你之前操作的问题:你选的「Extract required Library into generated JAR」这种方式,只能处理普通的Java库,没办法正确识别JavaFX的模块依赖结构,所以运行时JVM找不到JavaFX的组件,就报那个错啦。
备注:内容来源于stack exchange,提问作者Eddi1
相关产品推荐
相关产品推荐

