18

我正在尝试Listcom.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文件中,但这并没有解决问题。

4

2 回答 2

15

从长远来看,处理这种情况的安全方法是不再使用 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 标准, java.*,javax.*
  • JDK 特定的 API,一些com.sun.*,一些jdk.*

受支持的 API 可以从 JDK 中删除,但需要事先通知。通过运行静态分析工具了解您的代码是否使用了已弃用的 APIjdeprscan

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

编译时间

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

在你的情况下:

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

运行

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

于 2017-10-16T15:20:51.343 回答
-2

具有以下参数的 gradle.settings 可能会有所帮助

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
kotlin.code.style=official
于 2021-12-22T01:45:41.447 回答