maven
を使用し、他の内部アーティファクトに依存するアーティファクトがあります。私は Java-9 に移行中です。コードをモジュール化せずに(つまり、名前のないモジュール内で)すべてをJava 9に最初に移行する予定です。
私が遭遇する問題は、デフォルトのモジュールに含まれていないJava.xml.bind
に依存していることです。 MavenでJava.xml.bind
へのこの依存関係を表現する「正しい」方法はありますか?
モジュールシステム は、クラスパスからアプリケーションをロードする場合のように、名前のないモジュールがモジュールグラフを構築する方法を示しています。さらに、ドキュメント自体から:-
コンパイラが名前のないモジュールでコードをコンパイルするか、Javaランチャーが呼び出され、アプリケーションのメインクラスがクラスパスからアプリケーションクラスローダーの名前のないモジュールにロードされると、名前のないモジュールのルートモジュールのデフォルトセットは、次のように計算されます。
_
Java.se
_モジュールは、存在する場合はルートです。存在しない場合、アップグレードモジュールパス上のすべての_Java.*
_モジュール、またはexports
少なくとも1つのパッケージ(修飾なし)がルートであるシステムモジュール間。アップグレードモジュールパス上のすべての_
non-Java.*
_モジュール、またはexports
修飾なしの少なくとも1つのパッケージであるシステムモジュール間もすべてルートです。それ以外の場合、ルートモジュールのデフォルトセットはフェーズに依存します。
コンパイル時には、通常、コンパイルされるモジュールのセットです(これについては以下で詳しく説明します)。
リンク時には空です。そして
実行時には、_
--module
_(または略して-m)ランチャーオプションで指定されたアプリケーションのメインモジュールです。特定のプラットフォーム、ライブラリ、またはサービスプロバイダーモジュールがモジュールグラフに存在することを保証するために、デフォルトのルートセットにモジュールを追加することが必要な場合があります。どのフェーズでもオプション
--add-modules <module>(,<module>)*
ここで_<module>
_はモジュール名であり、指定されたモジュールをルートモジュールのデフォルトセットに追加します。
jetty.project で同様の問題が発生しましたが、同じものについて議論されたjdkメーリングリストの thread を使用し、修正を使用しました:
_--add-modules Java.se.ee
_
すべてのJava SEモジュールへのアクセスを提供し、あなたの場合は単に:
_--add-modules Java.xml.bind
_
これをMavenで使用するには、同じものを_maven-compiler-plugin
_に埋め込みます。
_<compilerArgs>
<arg>--add-modules</arg>
<arg>Java.xml.bind</arg>
</compilerArgs>
_
zhekaKozlovが示唆するとおり here 。
注意すべき重要な点は、APIの非推奨をマークすることは、おそらくその使用を避けたいことを意味するということです。この方法に適応するには、おそらく _jaxb-api:2.3.0
_ の依存関係の消費を開始できます。これはモジュールとしてロードでき、クラスパスからも実行できます。必要な変更は、依存関係リストに次を追加することです。
_<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
_
Update:-最終的には、Java-10がすでに出ており、次にJDK/11がリリースされると、理想的には JEP 320:Java EEおよびCORBAモジュール を削除し、そのような依存関係をスタンドアロンライブラリに置き換えます。
はい、渡す必要があります--add-modules
to Javaコンパイラ:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>9</release>
<compilerArgs>
<arg>--add-modules</arg>
<arg>javax.xml.bind</arg>
</compilerArgs>
</configuration>
</plugin>
その後、プロジェクトは正常にコンパイルされます。
JAXBは、Java EE(JAX-WS、JAF、JTA、およびいわゆる「共通注釈」)と共有される他のAPIとともに、Java SE 9で非推奨になり、 Java SEおよびJDKの将来のリリースで削除されることが提案されています。これらの各APIには、スタンドアロンバージョン/ダウンロードがあります。各APIには、それを維持する独自のJSRもあります。 JDKに含まれているAPIからスタンドアロンバージョンへの移行は、もちろん少し混乱を招くでしょう。
これらのAPIをJava SEおよびJDKから削除するための最初のステップは、これらのAPIを含むモジュールをデフォルトで解決しないことです。 JDK 9を使用してクラスパスでコードをコンパイルまたは実行すると、最初はAPIが存在しないように見えます。別の回答に記載されているように、簡単な回避策は、--add-modules Java.xml.bind
でコンパイルまたは実行することです。そのCLIオプションは「Java.xml.bind」モジュールをルートモジュールのセットに追加して起動時に解決します。このモジュールはJDKランタイムイメージに含まれているため、JDK 9で動作します。
迅速な回避策を超えて、JAXBを使用するアプリケーションまたはライブラリは、スタンドアロンバージョンのAPI /実装の使用に移行する必要があります。 JAXB 2.3.0はまもなくMaven Centralに公開され、JDK 9以降で動作するように変更されています。スタンドアロンバージョンは、他のJARファイルと同様にクラスパスにデプロイできます。最終的には、スタンドアロンバージョンを(アップグレード)モジュールパスに展開し、モジュールとして使用することも可能になります。 JDK 9移行ガイドには、JAXBまたはJava EEと共有される他のAPIを使用するコードを移行するためのオプションに関する詳細が記載されています。
さて、これが誰かを助けることを願っています。おそらく、Java 9または10をインストールしていて、このjavax.xml.bindエラーを回避できないことがわかった場合、おそらく= Java 8経由でjenvフォルダーごと(本当にあいまいになって申し訳ありませんが、それが私が持っているすべてです現時点での時間)?
しかし、Java_HOMEの正しい設定を追加すると、MacOS上のexport Java_HOME="$(/usr/libexec/Java_home -v 1.8)"
という問題が修正されました。