从 Java 9 访问 com.sun.tools.javac.util

2022-09-02 22:27:55

我正在尝试从 访问类。这在Java 8中工作正常,但是当切换到Java 9时,我收到以下错误:.Listcom.sun.tools.javac.utilPackage 'com.sun.tools.javac.util' is declared in module "jdk.compiler", which does not export it to the unnamed module"

我尝试添加到我的文件中,但这并没有解决问题。requires jdk.compiler;module-info


答案 1

从长远来看,处理这种情况的安全方法是避免使用JDK的这些内部API。

可以使用jdk.compiler模块的API作为com.sun.tools.javac包的替代品。

定义系统 Java 编译器及其命令行等效项 javac 以及 javah 的实现。

特别是对于com.sun.tools.javac.util.List,几乎所有非重写的自定义方法都可以从基于java.util.List接口的实现派生出来。


迁移指南中关于已删除 java.* API 的专栏指出 -

Java 团队致力于向后兼容性。如果应用程序在 JDK 8 中运行,则只要它使用受支持且供外部使用的 API,它就会在 JDK 9 上运行。

这些包括:

  • JCP standard, java.*javax.*
  • 特定于 JDK 的 API,一些 com.sun.*,一些 jdk。*

可以从 JDK 中删除受支持的 API,但必须另行通知。通过运行静态分析工具 jdeprscan,了解您的代码是否正在使用已弃用的 API。

然后添加到上面突出显示的风险中。

编译时

封装在 JDK 9 中的内部 API 在编译时不可访问,但在编译时可以通过命令行选项进行访问。--add-exports

在您的情况下:

--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED

运行时间

在运行时,如果它们在 JDK 8 中,它们仍然可访问,但在将来的发行版中,它们将变得不可访问,此时 or 选项也可用于使它们在运行时可访问。--add-exports--add-opens


答案 2

gradle.settings 与下面的 arg 它可能会有所帮助

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
kotlin.code.style=official

推荐