javax.jws.WebParamなどがコンパイルエラーになったらJava 11に更新されているかもしれない

周囲に突然Javaアプリケーションのコンパイルがエラーになる人がちらほら。原因はシンプルだったが、意図せず発生していたためメモ。

問題

Spring Bootを利用したアプリケーションが、macOSのPCでコンパイルできなくなる事例が発生。

Controllerのメソッド引数にJAX-WSjavax.jws.WebParam アノテーションが付与された箇所があり、WebParamが参照できず、コンパイルエラーが発生していた。

原因

非常に単純。

問題の端末で、Javaのバージョンが11に更新されていた模様。JAX-WSJava 11からは除外されたため、別途依存性を追加しないと、そのままではコンパイルできない。

javax.jws.WebParam については、WSDLを生成したりという意図はなく、単純に org.springframework.web.bind.annotation.RequestParam と間違えて使用されていた。

ただ、そもそもなぜJavaのバージョンが上がったのかについては特定できず。Javaの自動アップデートか?

対応

JAVA_HOMEJava 8を参照するよう変更して対応。

また、特に意味もないのにControllerの引数に javax.jws.WebParam が付与された状態も問題なので、それぞれ削除し、必要に応じて org.springframework.web.bind.annotation.RequestParam を付与した。

既存のソースコードに手を入れられない場合、コンパイルだけなら javax.xml.ws:jaxws-api および javax.jws:javax.jws-api を依存関係に追加すればいい。以下に詳しい。

terasolunaorg.github.io

動かす必要があれば、別途実装を依存関係に追加する必要がある。

Maven Repository: com.sun.xml.ws » jaxws-rt

wsimportなどのツールインストールはこちら。

qiita.com

その他にもいろいろ削除されたモジュールがある。以下に詳しい。

k11i.biz

振り返り

コンパイルエラーの出ているクラス名を確認し、 javax.jws あたりで大体わかった。

Spring MVCを使ったアプリケーションで WebParam が使われていたという、残念な状態に気づけて良かったのかもしれない。

Windowsの自分はどこ吹く風だったが、根本原因であるJava 11へのアップデートがかかった原因がわからないのは気持ち悪いなぁ。