はじめに
ここ数ヶ月、実務インターンをするようになってから、インターン先が変わるたびに環境構築をしているのですが、適当にやっているせいでJDKのバージョンが原因なエラーに幾度となく躓いてきました。
毎回調べて、
ああ...JDKのversionが原因か。で、どうするんだっけ。と調べるのが不毛なため備忘録として記事にしました。
この記事は自分のユースケースにおける対処法なため、他の方には当てはまらないかもしれませんが、随時updateしていければと思います。
躓いた具体的なユースケース
まず、
java -vesion
とターミナルで打つと、ご自身のJDKのバージョンがいくつか確認できるのでご参考までに。
How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
この時の自分のJDKは
java 12.0.2 2019-07-16
でした。
Java 9で「モジュール」の機能が追加された際に、標準ライブラリからいくつかのモジュールが非推奨となりました。
Java 9以降でJAXBを使用するには、外部JARが必要 #49
この機能追加により、 JAXB
なるモジュールも非推奨となり、上記のエラーが出るようになったみたいです。Java 8以下では再現せず、Java 9以上の環境で再現するとのこと。
解決策
Java 9, 10であれば、実行時のオプションで
--add-modules java.xml.bind
を指定してあげれば一旦は凌げます。
毎回オプションを追加するのが面倒臭いとか、そもそもJava 10より上のJDK環境の場合は以下の強引な解決策を試してみてください。
強引な解決策
Android StudioのJDKを使用する
まず、知っておくべきことが
Android Studioは、Javaの実行環境そのものを提供してくれています。
そのため、Android Studioがapkを作る時に使っているJavaのPathのメモ の記事でも言及されているように、普段我々がGUIでAndroid StudioでRunした際には、 Android StudioのJava環境でapplication moduleをビルドし、apkを作成しています。
逆に、
Android Studioの下部のTerrminalや、MacやWindowsのアプリケーションとして開いているターミナルでは、OSの実行環境が使用されます。
したがって、GUIではちゃんとビルドできるのに、
./gradlew assemble
等のコマンドでビルドしようとすると失敗するのはそのせいです。
GUIでビルドができるなら、Android Studioの実行環境でTerminalも動かしてしまえば良いということで、
.bashrc
や .zshrc
に環境変数のPathを通してあげればよさそうです。
export PATH=$PATH:/Applications/"Android Studio.app"/Contents/jre/jdk/Contents/Home/bin
export JAVA_HOME=/Applications/"Android Studio.app"/Contents/jre/jdk/Contents/Home
すると、Android Studioのバージョンにもよりますが、適切なJavaのバージョンでの実行環境でTerminalからも起動できるようになります。
ちなみにAndroid Studio 3.6-RC1では 1.8.0_212-release
でした。
異なるversionのJDKをダウンロードする
異なるversionといえども上記のAndroid Studioの実行環境から、 1.8.0
系が良さそうです。Java 8ですね。
Oracle社HP からinstallします。
installの手順は沢山記事があるのでそちらを参考願います。
最近からサインインが必要になったためOracleのアカウントを作らないと行けなかったはずです。
また、表示名が Java SE Development Kit 8u241
みたいな形で、 8u***
となっているかもしれませんが、それが1.8.0
系です。
installができたら、自分がインストールしたJDKのバージョン一覧をみてみましょう。
/usr/libexec/java_home -V
確認できたら、そのJDK versionを環境変数に設定します。
export JAVA_HOME=`/usr/libexec/java_home -v {java_version}
{java_version}
には先ほど確認したversionを入れましょう。
あとは無事設定できてるかを
java -version
で確認して、ちゃんと設定できていたらOKです。
参考文献
https://qiita.com/mas0061/items/2fe9333f045800d00b5c