【问题标题】:Accessing com.sun.tools.javac.util from Java 9从 Java 9 访问 com.sun.tools.javac.util
【发布时间】:2017-10-16 15:12:21
【问题描述】:

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

【问题讨论】:

  • 在JDK9中你需要使用javax.tools。未导出包中的类不可用。
  • @bramhaag 该包已在 Java 9 中被弃用。您应迁移到它们的等效实现,可以通过查看您的代码本身来描述。
  • 我只是查看了那个类,没有看到任何解释为什么开发人员可以需要该列表类而不是仅仅使用,例如ArrayList 或标准工厂方法返回的专用列表之一。
  • FWIW,这个类是Martin Odersky(Scala的设计师)在1.2天内写的。 Scala 的 List 的早期版本看起来非常相似。
  • 文件顶部附近的评论:“这不是任何受支持的 API 的一部分。如果您编写依赖于此的代码,则后果自负。此代码及其内部接口是如有更改或删除,恕不另行通知。” hg.openjdk.java.net/jdk9/jdk9/langtools/file/jdk-9+181/src/…

标签: java java-9 java-module sun


【解决方案1】:

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

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

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

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


Migration guide 的关于已删除 java.* API 的专栏声明 -

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

这些包括:

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

可以从 JDK 中删除受支持的 API,但必须事先通知。 通过运行来确定您的代码是否使用了已弃用的 API 静态分析工具jdeprscan.

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

编译时间

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

在你的情况下:

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

运行时间

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

【讨论】:

  • 这些 API 未被弃用;它们只是 javac 的内部接口,现在在 JDK 9 中默认情况下无法访问。否则,是的。
  • @StuartMarks 同意。 Internal API 似乎比deprecated 更好?澄清一下,我并不是说@Deprecated
  • 是的,internal 更可取。这些东西都没有被弃用。感谢更新。
  • 感谢您的建议,@StuartMarks :)
  • 我在哪里输入这个命令“--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED”?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多