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

当前回答

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

这为我解决了Windows上的问题。

源1源2

其他回答

我最近通过卸载更高版本的JDK并安装JDK 8解决了这个问题。安装JDK后,您需要给出路径。然后你需要在“C:\Users\Milan Adhikari\AppData\Local\Android\Sdk\tools”中打开命令提示符,并运行“sdkmanager—update”,这将更新你的Sdk,然后你需要在cmd中运行“flutter doctor—Android -licenses”并接受所有许可证。 现在你的问题应该解决了。

在我的例子中,我有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

对于我的情况,我使用sdkman来管理多个java版本。我将默认java版本设置为13。安装版本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路径(蓝色部分)>上移

这个问题有多种答案,取决于潜在的问题。也有多种答案可以间接解决实际问题。

核心问题是:

Android SDK工具与最新的Oracle JDK存在问题。您可以使用最新的Open JDK。(最新的OpenJDK附带Android Studio。) 你没有安装最新的Android SDK命令行工具。 您已经安装了最新的Android SDK命令行工具,但您使用的是E:\Android\ SDK \tools\bin而不是E:\Android\ SDK \cmdline-tools\latest\bin。

这里有一些系统的步骤来识别和解决你可能遇到的上述问题。

将环境变量指向Android Studio中的OpenJDK安装。根据您的安装,在这里找到:E:\Program Files\Android\Android Studio\jre。你必须遍历所有必要的变量,如PATH、JAVA_HOME、JAVA_BIN等,并确保它们都指向你的OpenJDK。

注意:您不必卸载/重新安装jdk。这可能只是修复了你上面的变量作为一个副作用。

检查环境变量是否正确(Windows: echo %JAVA_HOME%, echo %PATH%, where javac等) 进入Android Studio。在“设置”中,导航到“外观和行为>系统设置> Android SDK”。安装“Android SDK命令行工具” 在shell中,打开E:\Android\Sdk\cmdline-tools\latest\bin,然后运行sdkmanager——install "cmdline-tools;latest"

其他故障排除提示: 我把Android环境变量也弄乱了。运行'flutter doctor -v',输出将帮助您排除其他环境配置问题。