如何解决JDK21环境下Java 3D无法运行的问题
解决Java 3D应用在JDK21下运行失败的问题
错误原因
你遇到的IllegalAccessError本质是JDK 9及以上引入的**模块系统(JPMS)**限制了对Java核心模块内部API的访问。旧版Java 3D 1.5.2直接调用了sun.awt.Win32GraphicsConfig这个内部类,而java.desktop模块默认不会对外导出sun.awt这类内部包给未命名模块(你的应用因为依赖未模块化的旧Java3D jar,属于未命名模块)。
解决方案
方案1:使用适配JPMS的Java 3D新版本(推荐)
放弃老旧的1.5.2版本,改用支持模块系统的Java 3D维护版本(例如1.6.0及之后的官方更新版)。这类版本已适配JPMS,无需手动复制dll或jar到JDK目录:
- 若用构建工具(Maven/Gradle),直接添加对应依赖;
- 手动下载的话,确保获取的
j3dcore.jar、j3dutils.jar、vecmath.jar包含module-info.class文件,通过类路径(-cp)引入即可。
方案2:通过JVM参数临时开放内部API(应急方案)
如果暂时无法升级Java 3D,可通过JVM参数允许未命名模块访问所需内部包,同时适配JDK21的目录变化:
- 不再复制jar到JDK扩展目录:JDK9+已废弃
lib/ext扩展机制,改用-cp参数指定类路径; - 指定本地库路径:无需复制dll到JDK目录,用
-Djava.library.path指定Java3D的dll所在目录; - 添加模块导出参数:允许未命名模块访问
sun.awt相关内部包。
完整运行命令示例:
java -cp "C:\Program Files (x86)\Java\Java3D\1.5.2\lib\ext\j3dcore.jar;C:\Program Files (x86)\Java\Java3D\1.5.2\lib\ext\j3dutils.jar;C:\Program Files (x86)\Java\Java3D\1.5.2\lib\ext\vecmath.jar;." ^ -Djava.library.path="C:\Program Files (x86)\Java\Java3D\1.5.2\bin" ^ --add-exports java.desktop/sun.awt=ALL-UNNAMED ^ --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED ^ Java_3D_Pick
注意:此方案仅作临时应急,未来JDK版本可能彻底移除这些内部API,导致该方法失效。
方案3:修改代码适配(不推荐)
旧Java 3D的核心渲染逻辑深度依赖sun.awt内部类,修改代码适配JPMS的工作量极大,远不如直接升级Java 3D版本高效。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

