当安装android sdk工具时,会产生以下错误:

java.lang.NoClassDefFoundError: javax / xml /绑定/注释/ XmlSchema

为什么会发生这种情况,如何解决?

调试输出:

$ java --version
java 9
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
$ brew cask install android-sdk
==> Caveats
We will install android-sdk-tools, platform-tools, and build-tools for you.
You can control android sdk packages via the sdkmanager command.
You may want to add to your profile:
  'export ANDROID_SDK_ROOT=/usr/local/share/android-sdk'

This operation may take up to 10 minutes depending on your internet connection.
Please, be patient.

==> Satisfying dependencies
==> Downloading https://dl.google.com/android/repository/sdk-tools-darwin-3859397.zip
Already downloaded: /Users/tomasnovella/Library/Caches/Homebrew/Cask/android-sdk--3859397,26.0.1.zip
==> Verifying checksum for Cask android-sdk
==> Installing Cask android-sdk
==> 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.SdkManagerCli.main(SdkManagerCli.java:117)
==>     at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:93)
==> Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
==>     at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
==>     at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
==>     at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
==>     ... 5 more
Error: Command failed to execute!

==> Failed command:
/usr/local/Caskroom/android-sdk/3859397,26.0.1/tools/bin/sdkmanager tools platform-tools build-tools;26.0.1

==> Standard Output of failed command:


==> Standard Error of failed command:
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.SdkManagerCli.main(SdkManagerCli.java:117)

当前回答

我找到了两个对我有用的答案,而不需要卸载创建-反应-app所需的JDK 10(或9)。JDK 9和JDK 10都不兼容android-sdk !


Siu Ching Pong -飞鸟健二-建议修改sdkmanager脚本,替换这一行:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'  

:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

注意,这个mod在更新sdkmanager时会被覆盖。 查看他的帖子和他的链接,了解更多细节。 这个解决方案也是这个github问题线程中提到的解决方案之一。


German的帖子指出了冲突的来源,并提出了不会被更新覆盖的修复方案。 他建议重命名/Library/Java/JavaVirtualMachines/Info。plist是一种将它与寻找系统中Java的最高版本的脚本隔离的方法。这样,JDK 8将作为默认值返回。 显式引用JDK 10,或将其设置为$JAVA_HOME,您可以在需要时使用JDK 10,而不是默认值。 详情见他的文章。

其他回答

我在跑步时也遇到了同样的问题:

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"_

我解的是

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home    

$ ls /Library/Java/JavaVirtualMachines/

jdk-11.0.1.jdk      
jdk1.8.0_202.jdk

将Java改为使用1.8

$ export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home'

然后,相同的命令可以正常运行

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"

在命令行中运行java -version和javac -version命令,确保它们来自同一个JDK(例如:version 1.8.0_181)

如果不是,则必须修改PATH变量,使其只指向单个JDK。如果您不确定如何卸载,只需卸载除Java 8 (Windows中的添加/删除程序)之外的所有其他Java实例。目前,Unity和Android都建议你使用JDK 8。

使用Java 8,不需要导出Java .se.ee模块,如其他一些答案所示。您还可以删除已设置的任何JAVA_OPTS或其他环境变量。

正如@steven指出的,安装Java 8(这里有Ubuntu 16.04、18.04和20.04/20.10的链接https://computingforgeeks.com/how-to-install-java-8-on-ubuntu/),然后用下面的命令将其设置为默认Java版本:

sudo update-alternatives --config java

我也遇到了同样的问题,并按照建议安装了openjdk-8-jdk。检查javac -version会得到正确的版本,但是java -version显示的是版本11。

解决方案是:

sudo update-alternatives --config java

然后从菜单中选择版本8。

为Windows用户寻找解决方案

选项1在Android Studio SDK管理器中安装cmdline-tools


选项2从这个链接下载https://developer.android.com/studio#cmdline-tools

然后按照下面的教程来设置它 https://www.youtube.com/watch?v=wvi03sOBKWQ


接下来将cmdline-tools安装的路径复制到bin文件夹中

使用Android Studio SDK管理器 cmdline-tools安装在Android SDK Location下 例子: C:\Users\ %用户名% \ AppData \当地\ Android最新\ Sdk \ cmdline-tools \ \ bin


然后将该路径粘贴到环境变量路径中

控制面板>设置“查看路径”为“大图标”>系统>在右侧的“相关设置”下选择“高级系统设置”>环境变量

从这里开始,在“系统变量”下添加路径

确保cmdline-tools路径在tools路径(在图中红色框中突出显示)的上方。

选择路径>编辑>选择cmdline-tools路径(蓝色部分)>上移