👊
sdkmanager の NoClassDefFoundError と戦う
参考
参考になる記事は多かったが、最新の状況に対応しておらず手こずった。
以下の記事を参考にさせてもらいました。
- 以下二つは、古い Android Studio を入れている場合は動きそうだけど、最新の Android Studio では動かないっぽい
- 以下は、 adoptopenjdk8 が deprecated になっている上、後続プロジェクトのものも Apple Sillicon には対応していなかった
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
これで上手くいくはず。
Discussion