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

当前回答

在我的情况下,我需要JDK 8(试图在ubuntu下使用AVD和SDK管理器在Qt)和11的不同工具。不能删除版本11。

“JAVA_OPTS”解决方案没有做任何事情。我真的不喜欢导出JAVA_HOME,因为它可能迫使您从同一个shell(如Qt)启动调用这些utils的任何工具,或者迫使您将其永久化,这是不方便的。

所以对我来说,解决办法很简单。在~/Android/tools/bin/sdkmanager和~/Android/tools/bin/avdmanager的第二行添加如下内容:

JAVA_HOME=“/usr/lib/jvm/java-8-openjdk-amd64”

(或rev 8 jdk的任何路径)。

因此,这些命令行工具以独立模式工作,它们也可以在其他工具(如Qt)调用时工作,而jdk 11仍然是其他工具的系统默认值。没有必要混合lib等…

唯一的缺点是,对这些命令行工具的任何更新都将删除这些修改,您必须重新输入这些修改。

其他回答

Linux用户(我使用的是Debian发行版,Kali) 以下是我的解决方法。

如果您还没有jdk-8,您可以在oracle的网站上获得它

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

我得到了jdk-8u191-linux-x64.tar.gz

步骤1 -安装Java 在一个合适的位置移动并打开它,像这样

$ mv jdk-8u191-linux-x64.tar.gz /suitablelocation/
$ tar -xzvf /suitablelocation/jdk-8u191-linux-x64.tar.gz

您应该得到一个解压缩的文件夹,如jdk1.8.0_191 您可以随后删除tarball以节省空间

步骤2 -设置默认java位置的替代方案

$ update-alternatives --install /usr/bin/java java /suitablelocation/jdk1.8.0_191/bin/java 1
$ update-alternatives --install /usr/bin/javac javac /suitablelocation/jdk1.8.0_191/bin/javac 1

步骤3 -选择您的默认选项

$ update-alternatives --set java /suitablelocation/jdk1.8.0_191/bin/java
$ update-alternatives --set javac /suitablelocation/jdk1.8.0_191/bin/javac

步骤4 -确认默认java版本

$ java -version

笔记

In the original article here: https://forums.kali.org/showthread.php?41-Installing-Java-on-Kali-Linux, the default plugin for mozilla was also set. I assume we don't really need the plugins as we're simply trying to develop for android. As in @spassvogel's answer, you should also place a @repositories.cfg file in your ~/.android directory as this is needed to update the tools repo lists Moving some things around may require root authority. Use sudo wisely. For sdkmanager usage, see official guide: https://developer.android.com/studio/command-line/sdkmanager

要解决这个错误,可以降级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模块之路的尽头

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

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

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

Java 11参见:https://stackoverflow.com/a/51644855/798165

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

核心问题是:

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',输出将帮助您排除其他环境配置问题。

因为Java 11已经删除了JavaEE,你需要下载一些jar并添加到类路径中:

JAXB: https://javaee.github.io/jaxb-v2/

贾夫: https://www.oracle.com/technetwork/articles/java/index-135046.html

然后编辑sdkmanager.bat,以便设置CLASSPATH=…以;%CLASSPATH%结束

将CLASSPATH设置为包含JAXB和JAF:

set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar

那么sdkmanager.bat就可以工作了。