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

时间:2017-10-16 15:12:21

标签: java java-8 java-9 sun

我正在尝试从List访问com.sun.tools.javac.util课程。这适用于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文件中,但这并没有解决问题。

1 个答案:

答案 0 :(得分:6)

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

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

  

定义system Java compiler及其命令的实现   等效行, javac ,以及 javah

特别是对于 com.sun.tools.javac.util.List ,几乎所有未被覆盖的,自定义的方法都可以从基于 java.util.List.

Migration guide关于已移除java.* API 的专栏说明了

  

Java团队致力于向后兼容。如果   应用程序在JDK 8中运行,然后它将在JDK 9上运行   使用支持并供外部使用的API。

     

这些包括:

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

支持的API可以从JDK中删除,但只有通知。 通过运行查看代码是否使用了弃用的API   静态分析工具 jdeprscan

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

编译时间

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

在你的情况下:

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

运行时间

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