android: sdkmanagerを起動すると、NoClassDefFoundErrorで起動できない

ターミナルでsdkmanagerを起動すると、NoClassDefFoundErrorで起動しません。avdmanagerも同様です。

Ubuntu 18.04標準のJava 11ではなく、Android Studio同梱のJava 1.8をPATHに設定して、解決しました。

sdkmanagerでNoClassDefFoundError

Ubuntu 18.04を新規インストールしてから、Android Studioをsnapでインストールし、Android SDKは既定の ~/Android/Sdk/ にインストールしました。

ターミナルでsdkmanagerを起動すると、NoClassDefFoundErrorで起動しません。avdmanagerも同様です。

$ sdkmanager --version
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)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 5 moreCode language: Bash (bash)

sdkmanagerの位置を確認します。

$ which sdkmanager
/home/aoki/Android/Sdk/tools/bin/sdkmanager
Code language: Bash (bash)

試しに絶対パスで sdkmanager を起動してみましたが、やはりNoClassDefFoundErrorでした。

$ /home/aoki/Android/Sdk/tools/bin/sdkmanager --version
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
(省略)Code language: Bash (bash)

javaバージョンは、Java 11でした。

$ java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)
Code language: Bash (bash)

javaの位置を調べると、/usr/lib/jvm/java-11-openjdk-amd64/bin/java でした。

$ which java
/usr/bin/java

$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22  6月 24  2019 /usr/bin/java -> /etc/alternatives/java

$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 43  6月 24  2019 /etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-amd64/bin/java

$ ls -l /usr/lib/jvm/java-11-openjdk-amd64/bin/java
-rwxr-xr-x 1 root root 10304  1月 16 00:14 /usr/lib/jvm/java-11-openjdk-amd64/bin/java

$ /usr/lib/jvm/java-11-openjdk-amd64/bin/java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
Code language: Bash (bash)

解決方法

Ubuntu 18.04標準のJava 11ではなく、Android Studio同梱のJava 1.8をPATHに設定します。

Android Studioのインストール先に合わせて、読み替えて下さい。次の例は、snapでAndroid Studioをインストールした場合です。

Android SDKの下にjreが見つからないよ?

SDKのほうではなく、Android Studioの下を探してみて

まず、Android Studio同梱のJavaのバージョンを確認します。Java 1.8です。

$ /snap/android-studio/current/android-studio/jre/bin/java -version
openjdk version "1.8.0_212-release"
OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
OpenJDK 64-Bit Server VM (build 25.212-b4-5784211, mixed mode)
Code language: Bash (bash)

~/.bashrc の最後に、次の2行を追加します。

export JAVA_HOME=/snap/android-studio/current/android-studio/jre
export PATH=$JAVA_HOME/bin:$PATHCode language: Bash (bash)

編集後の .bashrc を適用するために、ターミナルを閉じて、再度ターミナルを開いてください。

ターミナルを閉じずにsourceコマンドで .bashrcを適用できますが、PATHの値がどんどん長くなってしまいます。再度ターミナルを開いたほうが確実です。

$ source ~/.bashrc

#または(ドット、スペース、~/.bashrc)

$ . ~/.bashrcCode language: Bash (bash)

javaバージョンと位置を確認します。

$ java -version
openjdk version "1.8.0_212-release"
OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
OpenJDK 64-Bit Server VM (build 25.212-b4-5784211, mixed mode)

$ which java
/snap/android-studio/current/android-studio/jre/bin/java
Code language: Bash (bash)

無事、sdkmanagerが起動しました。

$ sdkmanager --version
26.1.1Code language: Bash (bash)
タイトルとURLをコピーしました