👊

sdkmanager の NoClassDefFoundError と戦う

2024/10/19に公開

参考

参考になる記事は多かったが、最新の状況に対応しておらず手こずった。
以下の記事を参考にさせてもらいました。

Overview

Unity の話をしているが、 sdkmanager の実行 以降は Unity 以外の環境でも適用できるはず。

Unity 等で Android 用のビルドを行うと、以下のようなエラーが出ることがある。

Could not determine the dependencies of task ':unityLibrary:GoogleMobileAdsPlugin.androidlib:generateDebugRFile'.
> Failed to install the following Android SDK packages as some licences have not been accepted.
     platforms;android-31 Android SDK Platform 31
  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
  All licenses can be accepted using the sdkmanager command line tool:
  sdkmanager.bat --licenses

これをなんとかする。

sdkmanager の実行

解決するためには、まずは sdkmanager コマンドのパスを確認する。
Unity であれば、 Unity > Settings... > External Tools > Android で、 Android SDK の場所を確認できる。
SDK の中に sdkmanager があるので、以下のようなコマンドを実行してみる。

/Applications/Unity/Hub/Editor/6000.0.23f1/PlaybackEngines/AndroidPlayer/SDK/tools/bin/sdkmanager --licenses

これでライセンスが表示され、y 連打でうまくいくなら言う事はないが、どうも大抵は以下のエラーが表示される。

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:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	... 5 more

どうやら sdkmanager は java8 以下しか対応しておらず、9 以上のバージョンの java では上記エラーが表示されるらしい。なんじゃそりゃ。

java8 のインストール

と言うことで誠に遺憾ながら java8 をインストールする。
これはあくまで sdkmanager を実行するためだけにインストールするので、 Unity 等の実行環境に影響はない。
Oracle の Archive からダウンロードできる。

インストールされた JDK にパスを通す。

export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home"
export PATH=$JAVA_HOME/bin:$PATH

これは sdkmanager を実行するためだけの設定なので、実行が完了したら消す。

再度 sdkmanager を実行

/Applications/Unity/Hub/Editor/6000.0.23f1/PlaybackEngines/AndroidPlayer/SDK/tools/bin/sdkmanager --licenses

これで上手くいくはず。

GitHubで編集を提案

Discussion