事象
Unityで作成したアプリをリリースするためにAPI levelを30に上げる必要があり、
以下記事を参照し、コマンドプロンプトからUnityのSDKマネージャーを呼び出したところ
java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
エラーが出ました。
コマンドプロンプトの画面
解決(回避)方法
まずは結論から。
上記のコマンドプロンプトを使ってUnityのSDKを呼び出す方法は諦めました。
理由はjavaのダウングレードが必要になるためです。
(なぜ、SDKのAPI levelを上げたいのにjavaのバージョン下げなければならんのか!プンプン!)
以下の方法にしました。
成功した方法
単純にAndroid StudioからSDKをインストールしSDKをフォルダにコピーするやりかたです。
この記事がなければリリース諦めてたかも。。。
※ただし、Android Studioがインストールされていることが前提です
解説
理由を知りたい人のために私が理解した範囲で解説します。
最初に実施した方法がダメだった理由
最初に実施した方法は
UnityのSDKマネージャーという機能をコマンドプロンプトから呼び出して、AndoridのSDK API30をインストールする方法です。
UnityのSDKマネージャーはjavaを必要としています。
私のUnityのバージョンは古く2019年頃のバージョンですが、javaは最新のバージョン(18)を使用していました。
どうやらjavaのバージョンアップによりUnityのSDKマネージャーが必要としているclassファイルが無くなった、もしくは名前が変わったため(ふざけんな)
java.lang.NoClassDefFoundError
が出たものと思われます。
(下位互換がないのは困るぞ!java!)
なので、昔のjavaのバージョンでSDKマネージャーを起動しなければならず、
javaのダウングレードが必要となるので、この方法はやめました。
成功した方法の解説
対して、成功したほうの方法は
UnityのSDKマネージャーを使用せず、
Android StudioからAPI30のSDKをインストールして、
という発想です。
動かないUnityのSDKマネージャーを当てにしないやり方です。
また「インストール」と難しいことを考えずファイルをコピーするという発想です。
※先ほども記載しましたが、Android Studioがインストールされていることが前提です。
中級者への道
この問題を理解するには、そもそも3つの知識が必要でした。
- Unityが何で動いているのか?
- SDKのインストールはコピーでOK
- java.lang.NoClassDefFoundError
Unityは何で動いているのか?
UnityのSDKマネージャーはjavaを使っている
という意識がありませんでした。
UnityでC#使ったりjava使ったり。。。そこら辺の知識が頭に入っていれば早く解決できたのかもしれません。
SDKのインストールはコピーでOK
インストールにはインストール専用のツール(Unity SDK Manger)を使わないといけない
という、思い込みのせいで、時間がかかりました。
インストールなんていってますが、大体はファイルのコピーのはずです。
本質を理解することが大事です。
java.lang.NoClassDefFoundError
java.lang.NoClassDefFoundErrorが出るという事はどういうことか?
を考える必要がありました。
これはざっくり日本語で訳せば、
です。
そしたら、
- javaのパスが通っているのか?
- javaのバージョンが違うのか?
などが思い浮かぶはずです。
最後に
こういったエラー1つをとっても、エラーの意味を理解するようにすれば、初級者エンジニアから脱出するヒントが得られると思いました。