1前書き

Java 9にアップグレードしようとしたことのある人なら誰でも、以前のバージョンのJavaで動作していたコードをコンパイルするときに何らかの____NoClassDefFoundErrorを経験した可能性があります。

この記事では、欠けている一般的なクラス

JAXBException

と、それを解決するためのさまざまな方法について説明します。ここで提供されている解決策は、一般に、Java 9へのアップグレード時に欠落している可能性のあるすべてのクラスに適用できます。


2なぜJava 9は

JAXBException

を見つけられないのですか?

Java 9の最も議論されている機能の1つはモジュールシステムです。

Java 9モジュールシステムの目的は、コアJVMクラスと関連プロジェクトを独立したモジュールに分割することです

。これにより、実行に必要な最小限のクラスのみを含めることで、フットプリントの小さいアプリケーションを作成できます。

欠点は、デフォルトでは多くのクラスがクラスパスで使用できなくなっていることです。この場合、クラス

__JAXBException


は、

java.xml.bind__という名前の新しいJava EEモジュールの1つにあります。このモジュールはコアJavaランタイムには必要ないため、デフォルトではクラスパスには含まれていません。


__JAXBException

__を使用するアプリケーションを実行しようとすると、次のようになります。

NoClassDefFoundError: javax/xml/bind/JAXBException

これを回避するには、

__ java.xml.bind

__moduleをインクルードする必要があります。以下に示すように、これを達成するには複数の方法があります。


3短期ソリューション

JAXB APIクラスがアプリケーションで利用可能であることを確認する最も簡単な方法は、追加することです。追加するには、add-modules ____コマンドライン引数を使用します。

--add-modules java.xml.bind

しかし、これはいくつかの理由で良い解決策ではないかもしれません。

まず、

__– add-modules

__引数は、Java 9でも新しく追加されました。複数のバージョンのJavaで実行する必要があるアプリケーションの場合、これにはいくつかの課題があります。アプリケーションが実行されているJavaのバージョンごとに1つずつ、複数のビルドファイルを管理する必要があります。

これを回避するために、古いJavaコンパイラに対して

__- XX:IgnoreUnrecognizedVMOptions

__コマンドライン引数を使用することもできます。

ただし、これは、誤植やスペルミスの引数が私たちの注意を引くことができないことを意味します。たとえば、最小または最大のヒープサイズを設定して引数名を誤って入力しようとしても、警告は表示されません。アプリケーションは起動しますが、予想とは異なる設定で実行されます。

第二に、

__

– add-modulesオプションは将来のJavaリリースでは非推奨になるでしょう。これは、新しいバージョンのJavaにアップグレードした後のある時点で、未知のコマンドライン引数を使用するという同じ問題に直面し、その問題に再度対処する必要があることを意味します。


4長期ソリューション

Javaの異なるバージョン間で動作し、将来のリリースでは壊れない、より良いアプローチがあります。

解決策は、Mavenなどの依存関係管理ツールを利用することです。

このアプローチでは、他のライブラリと同様にJAXB APIライブラリを依存関係として追加します。

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

上記のライブラリには

JAXBException

を含むJAXB APIクラスのみが含まれています。アプリケーションによっては、他のモジュールを含める必要があるかもしれません。

JAXB APIの場合と同様に、

Maven成果物名はJava 9モジュール名

とは異なる場合があることにも注意してください。

Maven Central

にあります。


5結論

Java 9モジュールシステムには、アプリケーションサイズの縮小やパフォーマンスの向上など、多くの利点があります。

しかし、それはまた意図しない結果をもたらします。 Java 9にアップグレードするときは、アプリケーションが本当に必要とするモジュールを理解し、それらがクラスパスで使用可能になるようにするための手順を実行することが重要です。