2

私はJavaの初心者です。jdk 1.8 にアップグレードしようとしていたところ、「gradle テスト」の実行中に次のエラーが見つかりました。

/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()、 print()、li()、ulEnd()、printHtmlHeader()、center()、today()、printTop()、navLinks()、printBottom()、および printBodyHtmlEnd() が削除されました。

シンボル エラーを回避できる簡単な回避策はありますか? または、欠落している API を既存のものに置き換える必要があります。これは、参加者である私にとって大変な作業のように見えます。それを行う方法に関する既存の例はありますか? 私はインターネットをたくさん検索しましたが、役に立つものは何も見つかりませんでした。

CustomWriter.java のコードは、カスタム System Test タグを使用して Javadoc ページを出力するためのものです。助けていただければ幸いです - 時間がありません。

4

1 に答える 1

1

さて、ここで問題です。パッケージ内のクラスは、com.sun.tools.*内部 API として扱う必要があります。Java のドキュメントには、これらの API に対してコードを記述してはならないという明確な警告があります。

例えば:

Java 8 では、コードが使用しようとしているクラスのヘッダーに次のように記載されています。

これは、サポートされている API の一部ではありません。これに依存するコードを記述する場合は、自己責任で行ってください。このコードとその内部インターフェースは、予告なしに変更または削除されることがあります。

(太字は原文です!)

Java 7 ではそうではありませんでした (痛い!) 実際、Javadoc FAQ には、標準のドックレット クラスの再利用を奨励しているように見えるバージョンがあります。残念ながら、オラクルはこれらのクラスを閉鎖することを決定し、変更の意図があったかどうかにかかわらず、これを強化するいくつかの破壊的な API 変更も行いました。

それについて何ができますか?残念ながら、簡単な解決策はありません。

  • おそらく、変更可能な真のオープン ソース Doclet コードベースを見つけることができるでしょう。

  • おそらく、あなたのために仕事をしてくれる商用ベンダーまたはコンサルタントを見つけることができます.

  • または、単に "吸い上げ" てコードを書き直して、(内部) API の最新バージョンで動作するようにすることもできます。そして、将来もっと痛みを感じる必要があるかもしれないという可能性を持って生きてください.

  • または...ビルド/テストボックスにJava 7を再インストールして、カスタムドックレットを実行するために(単に)使用することもできます。


更新- 上記の「ルール」はパッケージ用であることが指摘されていsun.*ます。でも:

  • このドキュメントはパッケージについて何も述べていないため、それらが Java でサポートされている API 用に予約されていると明示的に述べられている やその他のパッケージと同じカテゴリにcom.sun.*分類されると推測するのは有効ではありません。java.*javax.*

  • com.sun.*サポート対象外と明示されているパッケージの例は他にもあります。たとえば、Oracle の「Compatibility Guide for Java 8」には次のように書かれています。

    このcom.sun.media.soundパッケージはサポート対象外の内部パッケージであり、外部アプリケーションで使用するためのものではありません。

    JDK の内部パッケージcom.sun.corba.seとサブパッケージは、制限付きパッケージ リストに追加されており、セキュリティ マネージャーで実行している場合は直接使用できません。

    パッケージに含まれる apt ツールとそれに関連する API はcom.sun.mirror、このリリースで削除されました。

結論として、パッケージが内部であるという明示的な声明がなくてもcom.sun.*、オラクルは >>今<< 適切な場合にそれらを内部として扱っています。場合によっては遡及的に。

于 2015-12-15T12:37:13.903 に答える