安装Android SDK失败:"java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema"。

529
安装Android SDK工具时会出现以下错误:

java.lang.NoClassDefFoundError: javax/xml/bind/annotation/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)

49
这个问题实际上涉及到在安装Android SDK时使用Java9的合法问题。 - jontro
51
我遇到了这个问题,将错误信息的第一行复制到谷歌搜索中,这个问题是谷歌搜索结果中排名第一的。不仅如此,下面的一个答案解决了我的问题。无论问题规则如何,这个问题明显达到了该网站的整体目的,所以它不应被关闭。 - Le Mot Juiced
1
/Library/Java/JavaVirtualMachines中删除早于Java 8的任何内容。 - Dimitris
7
问题出现在使用openjdk-8-jdkopenjdk-11-jdk软件包的Ubuntu 18.04上的Java 8和Java 11中。有人知道要安装什么才能获得javax/xml/bind/annotation/XmlSchema,或者如何避免在NDK中使用javax/xml/bind/annotation/XmlSchema吗? - jww
16
这句话的意思是:“这不是关于Java版本的问题,而是与命令行工具有关。我在安装命令行工具后通过了Java 16出现的错误。此外,你可以在这个问题的第二页找到正确的答案。” 要解决这个问题,可以按照以下步骤进行:打开Android Studio -> SDK管理器 -> SDK工具 -> 安卓SDK命令行工具 -> 安装。 - devsin
@ssss,谢谢。这就是“命令行工具”的实际原因。 - Imrul Kayes
40个回答

578
刚刚出现了这个错误,通过在Android Studio中下载“Android SDK命令行工具(最新版)”,在“首选项 > 外观与行为 > 系统设置 > Android SDK > SDK工具”下重新运行“flutter doctor --android-licenses”解决。
注意:对于Android Studio Giraffe | 2022.3.1 Patch 1版本,请在“文件 > 设置”中,在左侧面板中选择“语言和框架” > “Android SDK”,最后选择“SDK工具”。

Android SDK path on Android Studio

Command-line Tools

最后,将新工具添加到您的 PATH 中,在您的 .bashrc、.zshrc 或类似文件中,放在过时工具之前。
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin

13
尝试了上述解决方案,但在2021年的全新安装环境中均不起作用。对我来说,这是正确的答案。 - ZooMMX
3
Ubuntu 21 运行完美。 - lordvcs
7
这应该被标记为正确答案。降低Java的版本并不是正确的方法,那是非常倒退的做法! - Suryakant Bharti
3
目前在Android Studio中已经没有“首选项”选项了。现在可以通过文件中的“系统设置”进行调整。 - Trect
4
在我的macOS上,除了已经解释的内容之外,我还必须将$ANDROID_HOME/tools/bin移动到PATH之后的$ANDROID_HOME/cmdline-tools/latest/bin,因为其中有一些失败的sdkmanager/avdmanager二进制文件。 - Dragan Marjanović
显示剩余14条评论

187

今天早上我遇到了类似的问题(使用Unity3D构建Android时)。最终我卸载了JDK9并安装了Java SE Development Kit 8u144

  1. brew cask uninstall java # 卸载java9
  2. brew tap homebrew/cask-versions
  3. brew cask install java8 # 安装java8
  4. touch ~/.android/repositories.cfg # 没有这个文件,下一步会出错
  5. brew install --cask android-sdk

3
太好了 - 这对我在Android Studio中构建Flutter应用程序非常有效。谢谢! - Darragh Enright
28
这个不起作用了,brew cask install java8 无法正常运行。 - kdy
4
正确的命令似乎是现在 brew cask install homebrew/cask-versions/java8 - caesarsol
36
brew cask install homebrew/cask-versions/adoptopenjdk8 看起来可以使用。 - guruz
11
我必须使用brew install --cask homebrew/cask-versions/adoptopenjdk8代替brew cask install java8。 - Anna Billstrom
显示剩余17条评论

131
  • 我也遇到了这个错误
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:582)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
        ... 5 more
  • 然后,不需要卸载最新的Java环境(在我的情况下是Java 13)
  • 和安装Java 8
  • 我已经执行了以下步骤
  • 打开Android Studio > 转到配置 > 选择SDK管理器 > 转到SDK工具 > 勾选Android SDK命令行工具 > 应用 > 等待安装

enter image description here

enter image description here enter image description here

  • 重启命令行工具 enter image description here

  • 输入命令flutter doctor

  • 输入命令flutter doctor --android-licenses

  • 并通过输入y接受所有许可。

enter image description here


7
谢谢!好奇你是如何想到这个的。 - Pradyot
2
终于有一个可行的解决方案了。我无法感谢你足够在发布这个! - Jean-Paul
1
我得记住这个。让许可证工具在JAVA_HOME和这个小勾号上运行疯狂了,但只需5分钟就能让我构建我的项目。截图也很好看。 - Bhikkhu Subhuti
1
在Windows 10上对我有用!谢谢! - London Tran
@Pradyot 如果你遇到构建问题,可能是环境的原因,建议始终运行 flutter doctor -v - supamunkey

99

为解决此错误,您可以降级您的Java版本。

或在终端中导出以下选项:

Linux/MAC:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

Windows:

->

Windows操作系统:

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee

如果这不起作用,请尝试导出java.xml.bind

Linux:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind'

Windows

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind

要永久保存它,您可以将 JAVA_OPTS 导出到 Linux 上的个人配置文件中(例如 .zshrc.bashrc 等),或者将其添加为 Windows 上的环境变量。


注:对于没有 Java EE 模块的 Java 11/11+,此方法无效。如果需要此选项,请降级您的 Java 版本或等待 Flutter 更新

参考资料:JDK 11: End of the road for Java EE modules


7
这对我在Ubuntu 18.04上使用OpenJDK 10.0.2有效。 - user1243584
23
在macOS Mojave(10.14.2)上为我创建了一个新的错误: 初始化引导层时发生错误 java.lang.module.FindException:未找到模块java.se.ee - Randy
4
我也尝试了1.8.0_191版本,但仍然出现以下错误: 错误:无法找到或加载主类java.se.ee - Randy
4
此选项对于Java 8不需要,并且对于没有Java EE模块的Java 11无效。 - valdeci
13
无法工作,java.lang.module.FindException: 找不到模块 java.se.ee - Marwan
显示剩余7条评论

68
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee

这个方法解决了我的Windows问题。

来源1来源2


2
同样在Ubuntu 16.04上使用了这个(使用export而不是set),问题得到了解决。 - Benjamin Conlan
天才。非常感谢。我以为我得改变我的JVM。 - flakes
1
在Windows 10上使用Java 10完美运行 - pabz
4
很遗憾,在Java 11中似乎已完全删除了这个功能。 - Alastair Maw
在Ubuntu 18.04上工作时,执行了export JAVA_OPTS = '-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee' - Déjà vu
非常感谢,这个在jdk-14.0.2和Windows 10上运行良好。 - Yogesh Gosavi

60

更新2019年10月:

问题跟踪器中所述,Google正在开发新的Android SDK命令行工具版本,该版本可以在当前的JVM(9、10、11+)上运行,并且不依赖于已弃用的JAXB EE模块!

您可以通过从Google服务器手动下载或在Android Studio中使用新的Android SDK命令行工具:

有关最新版本,请查看repository.xml中的URL。

如果您手动解压缩命令行工具,请注意将它们放置在$ANDROID_HOME的子文件夹中(例如$ANDROID_HOME/cmdline-tools/...)。

更新2021年03月:

最新稳定的命令行工具可在谷歌下载网站获得。这些工具比上述链接中的工具更新。

4
在使用Java 9或更高版本时,这应该是现在的答案! - Luiggi Mendoza
2
@RohanDevaki c:\Users\username\AppData\Local\Android\Sdk\cmdline-tools\latest\bin\sdkmanager.bat - Smit Johnth
@Ashish 它适用于所有操作系统。我不知道“未能工作”是什么意思,但如果您手动解压可执行文件,则可以查看此问题:https://issuetracker.google.com/issues/143335476 - G00fY
1
你是对的。我把它放错目录了。它应该在$ANDROID_HOME/cmdline-tools/latest中...我使用的是底部提到的最新稳定命令行工具。 - Ashish
这个方法在2021年5月的Fedora 34上对我有效,在安装了Android Studio后。我不得不导航到$ANDROID_HOME/cmdline-tools/latest/bin并使用sdkmanager脚本接受许可证。 - mandrewsan
显示剩余3条评论

34
如果您使用的是Mac OS,并且不想更改Java版本(我不想),则可以在shell中暂时更改版本:
首先运行:
/usr/libexec/java_home -V

如果你已经安装了主要版本,请选择它,否则首先安装它:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

现在您可以运行sdkmanager。


4
执行 $ /usr/libexec/java_home -V 命令时出现 bash: /usr/libexec/java_home: No such file or directory 的错误提示。执行 apt-file search /usr/libexec/java_home 没有任何结果。 - Tino
你的 $JAVA_HOME 环境变量设置正确吗?运行:echo "export JAVA_HOME=`/usr/libexec/java_home`" >> ~/.bashrc (如果你使用profile则写入profile文件)- 重新加载:. ~/.bashrc - Sarah A
1
你也没有 /usr/libexec 目录。你在使用MacOS吗?(我是在Ubuntu/Linux和Ubuntu/Windows系统上工作) - Tino
我正在使用Mac电脑。你的Java_home在哪里? - Sarah A

28

在使用Linux时,一种简单的选择是安装JDK版本8,然后使用以下命令将其设置为默认选项:

sudo update-alternatives --config java

1
应该明确指出,这仅适用于Linux。 - c z

24

在 Mac/Linux 上使用以下命令:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

适用于JDK 9和10,无需修补任何脚本(sdkmanager,avdmanager)。

有关Java 11,请参见:https://dev59.com/xlYO5IYBdhLWcg3wEdn5#51644855


2
谢谢!这解决了在安装JDK 9时遇到的问题。 - Jorge Valvert

21
你需要将以下内容添加到你的个人资料中(适用于MacOS):
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
不需要打补丁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接