Java Doclet API 更改 jdk 8

Java Doclet API change for jdk 8

我是 Java 的新手。我试图升级到 jdk 1.8 并在执行 "gradle test":

时发现以下错误
/u01/sv/home/sv900t1/sv_test/Test_Suites/SeleniumLibraries/src/main/java/com/csgi/svtest/selenium/CustomWriter.java:57: error: cannot find symbol
        h2("Class "+classDoc.toString());
        ^
  symbol:   method h2(String)
  location: class CustomWriter
/u01/sv/home/sv900t1/sv_test/Test_Suites/SeleniumLibraries/src/main/java/com/csgi/svtest/selenium/CustomWriter.java:58: error: cannot find symbol
        printHyperLink(classDoc.toString()+".html","","Class description<br>",true);
        ^
  symbol:   method printHyperLink(String,String,String,boolean)
  location: class CustomWriter

我参考了http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java/

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java/

(我们的代码导入这个:import com.sun.tools.doclets.formats.html.SubWriterHolderWriter;)

并发现许多 api,如 h2()、printHyperLink()、hr()、table()、tableHeaderStart()、tableHeaderEnd()、tableEnd(), pre(), strong(), preEnd(), ul(), print(), li(), ulEnd(), printHtmlHeader(), center(), today(), printTop( )、navLinks()、printBottom() 和 printBodyHtmlEnd() 已被删除。

有没有一种快速的解决方法可以让我们绕过符号错误? 或者我们应该用现有的 api 替换缺少的 api。作为一名参赛者,这对我来说似乎是一项繁重的工作。有没有关于如何做到这一点的现有例子?我在互联网上搜索了很多,但找不到任何有用的东西。

CustomWriter.java 中的代码用于使用自定义系统测试标签输出 Javadoc 页面。感谢您提供任何帮助 - 我们时间紧迫。

问题来了。 com.sun.tools.* 包中的 classes 应被视为内部 APIs。 Java 文档中有明确的警告,指出您不应针对这些 API 编写代码。

例如:

在 Java 8 中,您的代码尝试使用的 class 的 header 表示:

This is NOT part of any supported API. If you write code that depends on this, you do so at your own risk. This code and its internal interfaces are subject to change or deletion without notice.

(粗体为原文!)

它没有在 Java 7 中说(哎哟!)确实有 Javadoc 常见问题解答的版本似乎 鼓励 人们重用标准 doclet classes。不幸的是,Oracle 已决定关闭这些 classes,并且还进行了一些突破性的 API 更改来强化这一点,无论这是否是更改的意图

你能做些什么?不幸的是,没有简单的解决方案:

  • 也许您可以找到可以修改的真正开源的 Doclet 代码库。

  • 也许您可以找到可以为您完成这项工作的商业供应商或顾问。

  • 或者您可能只是 "suck it up" 并重写您的代码以使用最新版本的(内部)API。并接受未来可能需要承受更多痛苦的可能性。

  • 或者...您可以在您的构建/测试盒上重新安装 Java 7 并将它(仅)用于 运行 您的自定义 doclet。


UPDATE - 已经指出上面的 "rule" 是针对 sun.* 包的。然而:

  • 该文档没有提及任何关于 com.sun.* 包的内容,因此推断它们与 java.*、[=14= 属于同一类别是无效的] 和其他明确声明为 Java 保留的支持 APIs.

  • 还有 com.sun.* 包的其他示例明确声明不受支持。例如,Oracle 的 "Compatibility Guide for Java 8" 是这样说的:

    The com.sun.media.sound package is an internal, unsupported package and is not meant to be used by external applications.

    The JDK internal package com.sun.corba.se and sub-packages have been added to the restricted package list and cannot be used directly when running with a security manager.

    The apt tool and its associated API contained in the package com.sun.mirror have been removed in this release.

结论,即使没有明确声明 com.sun.* 包是内部包,Oracle >>现在<<在适合它们时将它们视为内部包。在某些情况下,追溯。