2

我是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;)

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

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

CustomWriter.java 中的代码用于使用自定义 System Test 标记输出 Javadoc 页面。任何帮助表示赞赏 - 我们时间紧迫。

4

1 回答 1

1

那么问题来了。包中的类com.sun.tools.*应被视为内部 API。Java 文档中有明确的警告说您不应该编写针对这些 API 的代码。

例如:

在 Java 8 中,您的代码尝试使用的类的标头说:

这不是任何受支持的 API 的一部分。如果您编写依赖于此的代码,则风险自负。此代码及其内部接口如有更改或删除,恕不另行通知。

(加粗的是原文!)

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

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

  • 也许您可以找到一个真正开源的 Doclet 代码库,您可以对其进行修改。

  • 也许你可以找到一个商业供应商或顾问来为你做这项工作。

  • 或者,也许您只是“接受它”并重写您的代码以使用最新版本的(内部)API。并忍受将来您可能需要承受更多痛苦的可能性。

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


更新- 有人指出,上面的“规则”是针对sun.*包的。然而:

  • 该文档没有说明任何关于包的内容,因此推断它们与和其他明确声明为 Java 支持的 API 保留的com.sun.*类别属于同一类别是无效的。java.*javax.*

  • 还有其他com.sun.*明确声明不支持的软件包示例。例如,Oracle 的“Java 8 兼容性指南”是这样说的:

    com.sun.media.sound包是一个内部的、不受支持的包,不打算由外部应用程序使用。

    JDK内部包com.sun.corba.se和子包已添加到限制包列表中,使用安全管理器运行时不能直接使用。

    软件包中包含的 apt 工具及其相关 APIcom.sun.mirror在此版本中已被删除。

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

于 2015-12-15T12:37:13.903 回答