Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

Unity

UnityのAndroid SDK API level 30を上げようとしたらjava.lang.NoClassDefFoundError:javax/xml/bind/annotation/XmlSchemaエラー発生

事象

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のファイルにコピーすればいいんじゃね?

という発想です。

動かない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つをとっても、エラーの意味を理解するようにすれば、初級者エンジニアから脱出するヒントが得られると思いました。

0
広告