JavaFX调用stage.setFullScreen打包为exe后报错,javafx:run正常
问题核心
使用Gluon将JavaFX应用打包为Windows exe时,调用stage.setFullScreen(true)会抛出ClassNotFoundException: com.sun.javafx.tk.quantum.OverlayWarning,但mvn javafx:run可正常启动应用;替换为setMaximized(true)后exe能正常运行。环境配置为GraalVM Gluon 22.1.0.1-Final、JavaFX 17.0.1/11、Windows,已按Gluon文档安装Visual Studio依赖。
原因分析
com.sun.javafx.tk.quantum.OverlayWarning是JavaFX Quantum渲染引擎的内部类,调用setFullScreen(true)时会动态加载该类。但GraalVM原生镜像构建时,默认不会自动包含代码未直接引用的内部类,导致运行时无法找到该类。
解决方案
1. 添加反射配置文件
在项目src/main/resources/META-INF/native-image目录下创建reflect-config.json文件,内容如下:
[ { "name": "com.sun.javafx.tk.quantum.OverlayWarning", "allDeclaredConstructors": true, "allPublicConstructors": true, "allDeclaredMethods": true, "allPublicMethods": true, "allDeclaredFields": true, "allPublicFields": true } ]
该配置会告知GraalVM在构建原生镜像时,必须包含该类的所有反射元数据。
2. 调整pom.xml的GluonFX插件配置
确保插件能读取到上述反射配置文件,在pom.xml的<plugin>标签中添加资源配置:
<plugin> <groupId>com.gluonhq</groupId> <artifactId>gluonfx-maven-plugin</artifactId> <version>2.1.0</version> <configuration> <mainClass>你的主类全路径</mainClass> <!-- 配置资源目录,确保反射文件被打包 --> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <!-- 保留原有的其他配置 --> </configuration> </plugin>
注:插件版本需与GraalVM版本匹配,2.1.0适配GraalVM 22.1.0系列。
3. 可选:添加JVM参数强制加载内部类
也可在插件配置中添加JVM参数,提前触发类加载,避免原生镜像遗漏:
<configuration> <!-- 其他已有配置 --> <jvmArgs> <jvmArg>-Dcom.sun.javafx.tk.quantum.OverlayWarning.enabled=true</jvmArg> </jvmArgs> </configuration>
验证步骤
- 清理旧构建产物:
mvn clean - 重新构建原生镜像:
mvn gluonfx:build - 测试运行:
mvn gluonfx:nativerun
此时调用stage.setFullScreen(true)应不再抛出ClassNotFoundException。
内容的提问来源于stack exchange,提问作者Baptiste Cld

