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

Accessing com.sun.tools.javac.util from Java 9

我正在尝试从 com.sun.tools.javac.util 访问 List class。这适用于 Java 8,但是当切换到 Java 9 时,我收到以下错误:Package '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 文件中,但这并没有解决问题。

在较长的 运行 中,处理这种情况的安全方法是不再使用 JDK.

的这些内部 API

可以使用 jdk.compiler module's APIs as a replacement to the com.sun.tools.javac 包。

Defines the implementation of the system Java compiler and its command line equivalent, javac, as well as javah.

具体针对com.sun.tools.javac.util.List,其几乎所有非重写的自定义方法都可以派生自基于接口的实现java.util.List.


Migration guide 关于 删除的 java.* API 的专栏 指出 -

The Java team is committed to backward compatibility. If an application runs in JDK 8, then it will run on JDK 9 as long as it uses APIs that are supported and intended for external use.

These include:

  • JCP standard, java.*, javax.*
  • JDK-specific APIs, some com.sun.*, some jdk.*

Supported APIs can be removed from the JDK, but only with notice. Find out if your code is using deprecated APIs by running the static analysis tool jdeprscan.

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

编译时间

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

你的情况:

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

运行时间

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

gradle.settings 使用以下参数可能会有帮助

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