当安装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)

当前回答

要解决这个错误,可以降级Java版本。

或在您的终端上导出以下选项:

Linux -麦克:

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

窗口:

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

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

Linux:

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

窗口:

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

为了永久保存它,您可以在Linux上的概要文件中导出JAVA_OPTS。zshrc, .bashrc等)或将其作为Windows上永久的环境变量添加。


ps.这不适用于Java 11/11+,它没有Java EE模块。对于这个选项,降级Java版本或等待Flutter更新是个好主意。

参考:JDK 11: Java EE模块之路的尽头

其他回答

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

卸载java9 酿造tap自酿/桶酿版本 安装java8 如果没有这个文件,点击~/.android/repositories.cfg #,下一步将发生错误 Brew install—cask android-sdk

刚刚有这个错误,通过在Android Studio上下载Android SDK命令行工具(最新),在首选项>外观和行为>系统设置> Android SDK > SDK工具并重新运行flutter doctor——Android -licenses来解决

最后,将新工具添加到你的PATH中,在你的.bashrc, .zshrc或类似的目录中,在过时的工具之前:

export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin

降低java版本。无论系统或ide。

确保java版本不高于8

对我来说。我改变ide java版本。这解决了我的问题。

在我的例子中,我有Java 14,需要Java 8。

我使用的是Arch Linux,并安装了jdk8-openjdk jre8-openjdk https://www.archlinux.org/packages/extra/x86_64/java8-openjdk/

Debian用户https://wiki.debian.org/Java, Fedora用户https://docs.fedoraproject.org/en-US/quick-docs/installing-java/。

在执行以下步骤之前,使用包管理器安装Java 8(或所需版本,在本例中为jdk8-openjdk jre8-openjdk)。


1. 找出我的Java在哪里:

# which java
/usr/bin/java

2. 检查java文件:

我可以看到这里所有的java文件都链接到/usr/lib/jvm/default[一些]。这意味着java命令链接到特定版本的java可执行文件。

# ls -l /usr/bin/java*
lrwxrwxrwx 1 root root 37 May 16 06:30 /usr/bin/java -> /usr/lib/jvm/default-runtime/bin/java
lrwxrwxrwx 1 root root 30 May 16 06:30 /usr/bin/javac -> /usr/lib/jvm/default/bin/javac
lrwxrwxrwx 1 root root 32 May 16 06:30 /usr/bin/javadoc -> /usr/lib/jvm/default/bin/javadoc
lrwxrwxrwx 1 root root 30 May 16 06:30 /usr/bin/javah -> /usr/lib/jvm/default/bin/javah
lrwxrwxrwx 1 root root 30 May 16 06:30 /usr/bin/javap -> /usr/lib/jvm/default/bin/javap

3.检查default和default-runtime

在这里我可以看到默认版本链接到14(唯一安装版本)。

# cd /usr/lib/jvm
# ls -l
lrwxrwxrwx 1 root root   14 Aug  8 20:44 default -> java-14-openjdk
lrwxrwxrwx 1 root root   14 Aug  8 20:44 default-runtime -> java-14-openjdk
drwxr-xr-x 7 root root 4096 Jul 19 22:38 java-14-openjdk
drwxr-xr-x 6 root root 4096 Aug  8 20:42 java-8-openjdk

4. 切换默认版本

首先,删除现有的链接到java-14版本的default和default-runtime。

# rm default default-runtime

然后,创建到所需版本(在本例中为java-8)的新链接。

# ln -s java-8-openjdk default
# ln -s java-8-openjdk default-runtime

策略是使用上面的ln -s链接到所需的软件版本(在本例中是java8)。然后,这些链接链接到java bin目录中的二进制文件(不改变$PATH环境变量!)


或者,您可能希望使用archlinux-java命令更改Java版本,而不是使用更安全的方法:https://wiki.archlinux.org/index.php/Java

这个问题有很多答案,由于用户安装了不同的工具链和使用不同的Java版本,答案也各不相同。

使用Android开发工具链的推荐方法,或者至少是我建议使用的方法,是遵循Android Studio文档中的说明:

通过使用Android SDK管理器下载最新版本,您应该始终保持构建工具组件的更新。

Android studio允许您轻松管理已安装的sdk和构建工具,是的,它需要在您的硬盘驱动器上的一些空间,但它会节省您一些时间。一旦熟悉了它的工作方式,就可以只考虑安装命令行工具了。

如果没有使用旧Java版本的特殊原因,请使用最新(稳定)版本,您将拥有有趣的新特性,并且编译后的应用程序将受益于所有新的优化。

全新安装

删除你的Android本地文件夹,通常在主目录 下载Android studio 一旦安装,打开设置,搜索Android SDK并打开它 在SDK平台中为你的应用选择目标Android版本 在“SDK工具”页签中,选择“Android SDK构建工具”、“Android SDK命令行工具(最新)”、“Android模拟器”、“Android SDK平台工具” 在按OK之前,检查Android SDK Location路径是否正确 按OK键,让Android Studio下载并安装所有内容

(可选)如果您需要从命令行使用已安装的二进制文件,请确保将其文件夹添加到PATH变量中。如果你使用Android studio,这应该不是必需的。

我已经在我的机器上安装了Java 14,无论如何你可以使用Android Studio附带的jre。