周囲に突然Javaアプリケーションのコンパイルがエラーになる人がちらほら。原因はシンプルだったが、意図せず発生していたためメモ。
問題
Spring Bootを利用したアプリケーションが、macOSのPCでコンパイルできなくなる事例が発生。
Controllerのメソッド引数にJAX-WSの javax.jws.WebParam
アノテーションが付与された箇所があり、WebParamが参照できず、コンパイルエラーが発生していた。
原因
非常に単純。
問題の端末で、Javaのバージョンが11に更新されていた模様。JAX-WSはJava 11からは除外されたため、別途依存性を追加しないと、そのままではコンパイルできない。
javax.jws.WebParam
については、WSDLを生成したりという意図はなく、単純に org.springframework.web.bind.annotation.RequestParam
と間違えて使用されていた。
ただ、そもそもなぜJavaのバージョンが上がったのかについては特定できず。Javaの自動アップデートか?
対応
JAVA_HOME
がJava 8を参照するよう変更して対応。
また、特に意味もないのにControllerの引数に javax.jws.WebParam
が付与された状態も問題なので、それぞれ削除し、必要に応じて org.springframework.web.bind.annotation.RequestParam
を付与した。
既存のソースコードに手を入れられない場合、コンパイルだけなら javax.xml.ws:jaxws-api
および javax.jws:javax.jws-api
を依存関係に追加すればいい。以下に詳しい。
動かす必要があれば、別途実装を依存関係に追加する必要がある。
Maven Repository: com.sun.xml.ws » jaxws-rt
wsimportなどのツールインストールはこちら。
その他にもいろいろ削除されたモジュールがある。以下に詳しい。
振り返り
コンパイルエラーの出ているクラス名を確認し、 javax.jws
あたりで大体わかった。
Spring MVCを使ったアプリケーションで WebParam
が使われていたという、残念な状態に気づけて良かったのかもしれない。
Windowsの自分はどこ吹く風だったが、根本原因であるJava 11へのアップデートがかかった原因がわからないのは気持ち悪いなぁ。