JDK17下jshell使用jdk.compiler模块的JavacFileManager报错如何解决
问题解决方法
错误根因
JDK 9及以上版本引入了模块系统限制,com.sun.tools.javac.file 属于jdk.compiler模块的内部非公开包,默认不会导出给未命名模块(jshell默认运行在未命名模块下),仅添加--add-modules jdk.compiler仅能把模块加载到运行环境,没有开放内部包的访问权限,因此会触发包不可见的报错。
修复方案
启动jshell时额外添加--add-exports参数开放对应包的访问权限,完整启动命令如下:
jshell --add-modules jdk.compiler --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
参数说明:--add-exports 格式为 <模块名>/<包名>=<目标模块>,这里的ALL-UNNAMED指代所有未命名模块,刚好匹配jshell的默认运行环境。
验证操作
启动jshell后执行导入语句:import com.sun.tools.javac.file.JavacFileManager;
不再触发报错即代表配置生效,你可以正常使用该类的相关功能。
注意:该操作访问的是JDK内部API,不同版本的JDK内部包结构可能存在变动,仅推荐本地测试场景使用,生产环境不建议依赖内部API。
内容的提问来源于stack exchange,提问作者ght ggg
相关产品推荐
相关产品推荐

