💬

sdkmanager で jdk バージョン違いでこけるのを対処する

2020/09/28に公開

バージョン違いによる問題

jdk version9 以上の環境下で sdkmanager を使用すると、sdkmanager が version8 までしか対応していないため、次のようなエラーが発生してしまいます。
そのため、sdkmanager が使用する jdk を version8 になるようにパスを指定して上げる必要があります。

Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
        at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
        at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
        at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)

解決策

jdk8 をインストールする

まずは jdk8をインストールします。(以下は Mac でのインストール方法です)

$ brew cask install adoptopenjdk8

上記のコマンドで/Library/Java/JavaVirtualMachines/jdk8 がインストールされますので、ここにパスを通します。

$ echo 'export ANDROID_JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home' >> ~/.bash_profile
$ source ~/.bash_profile

SDK Manager の使用する JDK を指定する

SKD Manager はデフォルトで JAPA_HOMEで指定されている JDK を見に行きますので、これを先ほどパスと通した環境変数へ置き換える必要があります。
SKD Manager の設定ファイルは /usr/local/share/android-sdk/tools/bin/sdkmanager で、このシェルスクリプトを修正します。
# Determine the Java command to use to start the JVM.の後にある "$JAVA_HOME""$ANDROID_JAVA_HOME"へ変更します。(# Increase the maximum file descriptors if we can.の前までの全てを変更)
変更を保存して完了。

確認

JDK 9+ の動作と、sdkmanager の動作確認をします。

$ java --version
>>> java 14 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
$ sdkmanager --version
>>> 26.1.1

以上になります。

Discussion