JavaFX程序启动报IllegalAccessError,求可行修复方案
解决JavaFX启动时的IllegalAccessError问题
问题根源
这个错误由JavaFX模块化机制触发:javafx.graphics模块默认未将com.sun.glass.utils包导出给未命名模块(无module-info.java的项目属于此类),而JavaFX媒体组件的内部实现类com.sun.media.jfxmediaimpl.NativeMediaManager需要访问该包下的NativeLibLoader类,因此触发了权限访问限制。
解决方案
1. 添加VM启动参数(最通用方案)
在程序启动时添加以下VM参数,强制javafx.graphics模块将指定包导出给所有未命名模块:
--add-exports javafx.graphics/com.sun.glass.utils=ALL-UNNAMED
不同环境的配置方式:
- IDEA/Eclipse:在Run/Debug配置的「VM Options」栏直接填入上述参数。
- 命令行运行:
java --add-exports javafx.graphics/com.sun.glass.utils=ALL-UNNAMED -jar your-app.jar - Maven项目:在
pom.xml的编译、测试插件中配置argLine:<build> <plugins> <!-- 编译阶段配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>17</release> <!-- 替换为你的Java版本 --> <compilerArgs> <arg>--add-exports</arg> <arg>javafx.graphics/com.sun.glass.utils=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin> <!-- 运行/测试阶段配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <argLine>--add-exports javafx.graphics/com.sun.glass.utils=ALL-UNNAMED</argLine> </configuration> </plugin> </plugins> </build>
2. 模块化项目(含module-info.java)适配
如果你的项目是模块化项目,需将包导出给具体模块而非所有未命名模块:
- 先在
module-info.java中声明依赖:module com.example.myfxapp { requires javafx.graphics; requires javafx.media; // 使用JavaFX控件时需添加:requires javafx.controls; } - 启动时使用以下VM参数:
--add-exports javafx.graphics/com.sun.glass.utils=com.example.myfxapp
3. 检查JavaFX版本一致性
确保项目中所有JavaFX依赖模块(javafx.graphics、javafx.media、javafx.controls等)的版本完全一致,版本不兼容也可能触发类似权限异常。
内容的提问来源于stack exchange,提问作者Chris Tapia
相关产品推荐
相关产品推荐

