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
ファイルに追加してみましたが、問題は解決しませんでした。
長期的には、このような状況に対処する安全な方法は、JDKのこれらの内部APIの使用をやめることです。
jdk.compiler
モジュールのAPIをの代わりとして使用できます com.Sun.tools.javac
パッケージ。
system Java compiler の実装と同等のコマンドライン、javac、およびjavah。
特にcom.Sun.tools.javac.util.List
の場合、そのオーバーライドされていない自己定義メソッドのほとんどすべてが、インターフェイスJava.util.List
。
移行ガイド のに関する列の削除Java.*
APIsは次のように述べています-
Javaチームは下位互換性に取り組んでいます。アプリケーションがJDK 8で実行されている場合、サポートされている外部使用を目的としたAPIを使用している限り、JDK 9で実行されます。
これらには以下が含まれます:
- JCP標準、
Java.*
、javax.*
- JDK固有のAPI、一部
com.Sun.*
、一部jdk.*
サポートされているAPIはJDKから削除できますが、予告なしに削除できます。コードが静的分析ツール
jdeprscan
を実行して非推奨のAPIを使用する。
次に、上記の強調表示されたリスクに追加します。
JDK 9にカプセル化されている内部APIはコンパイル時にはアクセスできませんが、--add-exports
コマンドラインオプションを使用してコンパイル時にアクセスできるようにすることができます。
あなたの場合:
--add-exports jdk.compiler/com.Sun.tools.javac.util=ALL-UNNAMED
ランタイムでは、JDK 8にあった場合でも引き続きアクセス可能ですが、将来のリリースではアクセスできなくなります。この時点で、--add-exports
または--add-opens
オプションを使用して、実行時にアクセス可能にすることができます。上手。