5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

React Native 環境構築時に sdkmanager に NoClassDefFoundError って言われたという話

Posted at

調べるのに結構かかったので、備忘録として。
なお、今回参照した公式ドキュメントの選択肢は下記の通りです。

  • React Native CLI Quickstart
  • macOS
  • Android

記事の要約

  • React Native の公式ドキュメント通りに環境構築したけどエラーが起きたよ
  • sdkmanager を起動すると NoClassDefFoundErrorって言われたよ
  • なぜかsdkmanagerが2つあって、もう片方の sdkmanagerはちゃんと動いたよ

ことの始まり

React Native でアプリ開発してイケイケになりたいという気持ちで環境構築を始めました。
参考にしたのは下記の公式ドキュメントです。

選択肢はそれぞれ下記の通りです。

  • React Native CLI Quickstart
  • macOS
  • Android

ドキュメントに従い進めていきます。Android Studio は事前にインストールしてあったのでそちらを使います。
2. Install the Android SDKの最後に「ANDROID_HOMEの設定が終われば sdkmanagerのコマンドが叩けるよ(意訳)」と書いてあったので、sdkmanagerを叩く前に 3. Configure the ANDROID_HOME environment variableを進めました。
というわけで、設定を ~/.zshrcに入れました。

.zshrc
# 不要な部分は省略
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools

環境変数を適用するためにターミナルを再起動してから sdkmanagerを叩きました。

$ sdkmanager
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:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 5 more

うん?

調べたこと

さて、なんとかしなければReact Nativeを使うことができません。
Google先生で調べてみましたが、出てくるのはだいたい下記のような情報です。

自前のJava11じゃなくてAndroid Studio同梱のJava1.8を使えばOK

ところが、私のAndroid StudioにはJava11が同梱されています。

$ /Applications/Android\ Studio.app/Contents/jre/Contents/Home/bin/java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+0-b60-7590822)
OpenJDK 64-Bit Server VM (build 11.0.11+0-b60-7590822, mixed mode)

また、公式ドキュメントでもJava11を導入するように指示があります。

Java Development Kit
We recommend installing JDK using Homebrew. Run the following commands in a Terminal after installing Homebrew:

brew install --cask adoptopenjdk/openjdk/adoptopenjdk11

Java1.8を利用するのは想定されていないと考えるのが妥当でしょう。
とはいえ、そこから答えに辿り着くのが結構大変でした。

解決策

解決策が見つかったのは下記のページです。

which sdkmanager -> this should point to /Users/brunnock/Library/Android/sdk/cmdline-tools/latest/bin/sdkmanager
sdkmanager --version -> this should show 6.0

sdkmanagerのパスとバージョンが指示されていますね。
バージョンについてはlatest(6.0)しかインストールしていないので大丈夫だと思います。
一方で、パスについては下記の通りに指定したはずです。

.zshrc
# 不要な部分は省略
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin # ←ココ
export PATH=$PATH:$ANDROID_HOME/platform-tools

つまり、指定するsdkmanagerのパスが誤っているように思えます。
そこで上記を修正して再度sdkmanagerを叩いてみましょう。

.zshrc
# 不要な部分は省略
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
# export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin # 追加
$ sdkmanager
[=======================================] 100% Computing updates...  

やったぜ!
って誤っていた方のパス、公式ドキュメントの指定だったはずですが……うーん?

エラーの原因

せっかくなのでもう少し確認してみましょう。
エラーの起きた方のsdkmanagerと正常に動作した方のsdkmanagerを比較してみます。

エラーが起きた方
#!/usr/bin/env sh

##############################################################################
##
##  sdkmanager start up script for UN*X
##
##############################################################################

# 以下省略
正常に動作した方
#!/usr/bin/env sh

##############################################################################
##
##  sdkmanager start up script for Mac
##
##############################################################################

# 以下省略

ここでは省略して一部分しか載せていませんが、何箇所か違いがありました。
差分を見る限り、正常に動作したのはMac用の sdkmanagerのようです。
つまり、Mac用ではない sdkmanagerを使っていたから想定通りにシェルスクリプトが動作せずにエラーが起きていたんですね。

なぜ指定のディレクトリにMac用ではない sdkmanagerがいたのかは結局わからずじまいですが……
Android Studioは事前にインストールしてあったのでドキュメント通りの操作ではなく、もしかしたらそれが原因かなぁとも思いますが、確認はしていないです。

終わりに

というわけで、Macで sdkmanagerNoClassDefFoundErrorと言われたらパスの指定が誤っていることを疑ってみてもいいかも、という話でした。

5
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?