Mac M1打包JavaFX应用启动报错:No toolkit found
问题分析与解决办法
核心原因
你遇到的No toolkit found异常,本质是jlink生成的自定义JRE缺少JavaFX图形模块的支持,同时Spring Boot Fat Jar的结构导致JavaFX的native组件无法被模块化JRE正确加载:
- 你用jlink只打包了
java.base、java.logging等核心模块,但JavaFX的Toolkit属于javafx.graphics模块,该模块包含Mac平台的native toolkit实现,自定义JRE里没有这个模块,自然找不到Toolkit。 - 虽然你的Jar里包含JavaFX类,但模块化JRE默认只会加载自身模块路径下的模块,Fat Jar里的JavaFX类无法被模块化机制识别,导致相关依赖无法初始化。
解决办法
1. 重新用jlink生成包含JavaFX模块的JRE
生成自定义JRE时,必须显式加入JavaFX的核心模块,针对Mac aarch64架构,执行类似命令:
jlink --module-path $PATH_TO_JAVAFX_MODS:$JAVA_HOME/jmods \ --add-modules java.base,java.logging,javafx.graphics,javafx.controls,javafx.fxml \ --output custom-jre-mac-aarch64 \ --strip-debug --compress=2
注意:$PATH_TO_JAVAFX_MODS要指向对应aarch64架构的JavaFX模块包(不是Jar,是jmods或者模块化的Jar目录),确保和你的Temurin-18版本匹配。
2. 调整启动脚本的参数
在Mac App的启动脚本里,需要补充JavaFX相关的启动参数:
./custom-jre-mac-aarch64/bin/java \ -XstartOnFirstThread \ --add-modules javafx.controls,javafx.graphics \ --module-path ./path/to/javafx-mods \ -jar drkodi-mac-aarch64.jar
-XstartOnFirstThread:Mac平台JavaFX启动的强制参数,确保UI线程在主线程。--add-modules:显式指定需要加载的JavaFX模块。--module-path:如果你的Fat Jar里的JavaFX不是模块化的,需要单独指定JavaFX模块的路径(可以把JavaFX的模块Jar放到App的Contents/Resources目录下)。
3. 确保JavaFX Native组件被正确放置
JavaFX的Mac native组件(.dylib文件)需要被JRE识别到,你可以:
- 将native文件放到自定义JRE的
lib目录下。 - 或者在启动脚本里添加
-Djava.library.path=./Contents/Resources/native参数,指向native文件所在的目录。
4. 改用jpackage官方工具打包(推荐)
jpackage是Oracle官方提供的打包工具,能自动处理JRE、JavaFX依赖和native组件,适合Spring Boot + JavaFX的场景,示例命令:
jpackage --type app-image \ --name DrKodi \ --input ./path/to/jar \ --main-jar drkodi-mac-aarch64.jar \ --runtime-image ./custom-jre-mac-aarch64 \ --java-options "-XstartOnFirstThread --add-modules javafx.controls,javafx.graphics"
jpackage会自动生成符合Mac标准的App包,不需要手动处理启动脚本和native组件路径。
内容的提问来源于stack exchange,提问作者kerner1000
相关产品推荐
相关产品推荐

