DatatypeConverter が java.lang.classnotfoundexceptionエラーを吐く件について
最近JAVA10の環境で昔のプロジェクトをビルドしなければならない事があり、
いざ試してみるとやはりエラーを吐いてきました。
内容はjava.lang.classnotfoundexceptionと言う物です。
何かのクラスが欠損しているエラーですね。
元のJava8の環境では正常に動作していたので何やら元々内蔵されていたクラスがJava10では外れていると言う事かな?
エラーを吐いていたのはDatatypeConverterと言う奴でした。
Java8→9のモジュールの違いを見たら
Java SE の EE モジュール (java.se.ee) がデフォルトで実行できなくなっているようです。
元々java.xml.bindは直接importすれば使えるモジュールなのですが、
Java9からは--add-modulesをコマンドにつけなければいけないらしいです。
ちなみに他にはjavax.annotation、javax.activation, javax.transaction等も同じ扱いになっているようです。
例でいうと:
java --add-modules java.xml.bind
とオプションに付ける事でこのモジュールが使用可能になります。
ちなみに複数のモジュールを追加する為には,で区切り追加すれば可能です。
試してみたら無事ビルドに成功できました。
しかし毎回付け足すのは面倒なので、gradleの中で
tasks.withType(Test) { jvmArgs += ["--add-modules", "java.xml.bind"] }
と付け足したら上手く動作してくれました。
私の環境でjava.xml.bindモジュールを使っているのはテスト環境のみなのでTest環境でのみの追加になります。
ちなみに複数の環境(java8, java10)でどっちも動作したい場合は、gradleの中で
if(JavaVersion.current() != JavaVersion.VERSION_1_8)
の様な感じで分岐するのも一つの手でしょう。
しかしgradleに新しい依存関係を追加する訳では無くコマンドにオプションを付けることで追加されるもんなんですね。
まあ無事解決できたのでここまで。