安装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)
答案 0 :(得分:93)
今天早上我遇到了类似的问题(尝试使用Unity3D为Android构建)。我最终卸载了JDK9并安装了Java SE Development Kit 8u144。希望这会有所帮助。
brew cask uninstall java
#uninstall java9 brew tap caskroom/versions
brew cask install java8
#install java8 touch ~/.android/repositories.cfg
#没有此文件,下一步会发生错误brew cask install android-sdk
答案 1 :(得分:61)
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 8
,open the android studio > go to configure > select sdk manager > go to sdk tools > make a tick on android sdk command line tools >apply > and wait for installation
答案 2 :(得分:52)
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
这解决了我在Windows上的问题。
答案 3 :(得分:45)
要解决此错误,您可以降级Java版本。
或在您的终端上导出以下选项:
Linux / MAC:
export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Windows :
set JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
要永久保存它,您可以将JAVA_OPTS
导出到Linux上的配置文件中(.zshrc
,.bashrc
等),或在Windows上永久添加为环境。
ps。。这不适用于Java 11+,因为Java 11+没有Java EE模块。使用此选项是个好主意,请降级Java版本或等待Flutter update。
答案 4 :(得分:14)
在Mac / Linux上使用:
export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
适用于JDK 9和10,无需修补任何脚本(sdkmanager,avdmanager)
答案 5 :(得分:10)
遇到这个错误,可以通过在Android SDK Command-line Tools (latest)
下的Android Studio中下载settings > Appearance & Behavior > System Settings > Android SDK > SDK Tools
并重新运行flutter doctor --android-licenses
答案 6 :(得分:7)
奇怪的是Java9与android-sdk不兼容
$ avdmanager
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.AvdManagerCli.run(AvdManagerCli.java:213)
at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
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
将所有命令合并为一个以便于参考:
$ sudo rm -fr /Library/Java/JavaVirtualMachines/jdk-9*.jdk/
$ sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$ sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefPane
$ /usr/libexec/java_home -V
Unable to find any JVMs matching version "(null)".
Matching Java Virtual Machines (0):
Default Java Virtual Machines (0):
No Java runtime present, try --request to install
$ brew tap caskroom/versions
$ brew cask install java8
$ touch ~/.android/repositories.cfg
$ brew cask install android-sdk
$ echo 'export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"' >> ~/.bash_profile
$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
$ avdmanager
Usage:
avdmanager [global options] [action] [action options]
Global options:
-s --silent : Silent mode, shows errors only.
-v --verbose : Verbose mode, shows errors, warnings and all messages.
--clear-cache: Clear the SDK Manager repository manifest cache.
-h --help : Help on a specific command.
Valid actions are composed of a verb and an optional direct object:
- list : Lists existing targets or virtual devices.
- list avd : Lists existing Android Virtual Devices.
- list target : Lists existing targets.
- list device : Lists existing devices.
- create avd : Creates a new Android Virtual Device.
- move avd : Moves or renames an Android Virtual Device.
- delete avd : Deletes an Android Virtual Device.
答案 7 :(得分:7)
您需要在个人资料中添加以下内容(在MacOS上适用):
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
无需打补丁。
答案 8 :(得分:6)
由于Java 11删除了JavaEE,因此您需要下载一些jar并将其添加到类路径中:
JAXB: https://javaee.github.io/jaxb-v2/
JAF: https://www.oracle.com/technetwork/articles/java/index-135046.html
然后编辑sdkmanager.bat,以使 set CLASSPATH = ... 以;%CLASSPATH%
结尾设置CLASSPATH以包括JAXB和JAF:
set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar
然后sdkmanager.bat将起作用。
答案 9 :(得分:4)
如果您不想更改Java版本(我不需要)。您可以在外壳中临时更改版本:
首次运行
/usr/libexec/java_home -V
然后选择主要版本(如果已安装),否则请首先安装:
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
现在您可以运行sdkmanager
答案 10 :(得分:4)
只需安装JDK版本8,然后使用以下命令将其选择为默认版本:
sudo update-alternatives --config java
答案 11 :(得分:3)
就我而言,我需要同时使用JDK 8(试图在ubuntu下的Qt中使用AVD和SDK管理器)和11来使用不同的工具。无法删除版本11。
“ JAVA_OPTS”解决方案没有执行任何操作。我真的不喜欢导出JAVA_HOME,因为它可能会迫使您从同一外壳(例如Qt)启动任何调用这些utils的工具,或者迫使您将其永久化,这不方便。
所以对我而言,解决方案非常简单。在〜/ Android / tools / bin / sdkmanager和〜/ Android / tools / bin / avdmanager的第二行中添加类似的内容:
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
(或任何通往版本8 jdk的路径)。
有了这些,这些命令行工具就可以在独立模式下工作,当被其他工具(例如Qt)调用时,它们也可以工作,而jdk 11仍然是其他人的系统默认设置。无需混合库等...
唯一的缺点是对这些命令行工具的任何更新都将删除这些修改,您必须将这些修改放回去。
答案 12 :(得分:2)
答案 13 :(得分:2)
更新2019-10:
与stated in the issue tracker一样,Google正在开发一个新的 Android SDK命令行工具版本,该版本可在当前JVM(9、10、11+)上运行,并且不依赖于已弃用的JAXB EE模块!
您已经可以在Android Studio内的canary频道上下载并使用新的 Android SDK命令行工具,也可以通过从Google服务器手动下载它们来
对于最新版本,请检查repository.xml内的URL。
如果您手动解压缩命令行工具,请注意将其放在$ANDROID_HOME
(例如$ANDROID_HOME/cmdline-tools/...
)内的子文件夹中。
答案 14 :(得分:2)
TLDR;尝试在OSX上设置JAVA_HOME对我来说效果很好
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
要从AdoptOpenJDK安装JDK 8(LTS):
# brew tap adoptopenjdk/openjdk
brew cask install adoptopenjdk/openjdk/adoptopenjdk8
答案 15 :(得分:2)
就我而言,我有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
)。
# which java
/usr/bin/java
我可以看到这里的所有Java文件都是指向/usr/lib/jvm/default[something]
的链接。这意味着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
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
首先,删除链接到Java-14版本的现有default
和default-runtime
。
# rm default default-runtime
然后,创建指向所需版本(在本例中为Java-8)的新链接。
# link -s java-8-openjdk default
# link -s java-8-openjdk default-runtime
该策略是使用上面的ln -s
链接到所需版本的软件(在本例中为java8)。然后,此链接链接到java bin目录内的二进制文件(,无需更改$PATH
环境变量!)
或者您可能希望使用archlinux-java
命令来更改Java版本,而要使用更安全的方法:https://wiki.archlinux.org/index.php/Java
答案 16 :(得分:1)
对于Linux用户(我正在使用Debian Distro,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 您可以随后删除压缩包以节省空间
第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
注释
答案 17 :(得分:1)
在命令行中运行java -version
和javac -version
命令以确保它们来自同一JDK(例如:1.8.0_181版)
如果没有,则必须修改PATH
变量,使其仅指向单个JDK。如果不确定如何安装,只需卸载Java 8(Windows中的“添加/删除程序”)以外的所有其他Java实例。今天,Unity和Android都建议您使用JDK 8。
对于Java 8,不需要像其他一些答案中所示的那样导出java.se.ee
模块。您也可以删除自己设置的任何JAVA_OPTS
或其他environment variables。
答案 18 :(得分:1)
对于Windows机器卸载JDK,如果它超过1.8.172。 安装JDK 1.8.172
我在使用java 10的Windows 10中遇到了同样的问题。我卸载了java 10并安装了java8,它现在对我来说工作正常:)
答案 19 :(得分:1)
从最新版本的Android命令行工具(截至撰写本文时为2.1)开始,不再需要修补sdkmanager或降级到Java的较旧版本。
只需更新您的SDK软件包,并将命令行工具切换到latest
版本,该版本就会跟踪新版本的出现:
sdkmanager --update
sdkmanager 'cmdline-tools;latest'
sdkmanager --uninstall 'cmdline-tools;1.0'
如果sdkmanager
不在您的PATH
上,则可能需要提供完整的路径;如果引用了{{1 }}工具。
答案 20 :(得分:1)
我最近通过卸载更高版本的JDK并安装JDK 8解决了此问题。安装JDK之后,您需要提供路径。然后,您需要在“ C:\ Users \ Milan Adhikari \ AppData \ Local \ Android \ Sdk \ tools”中打开命令提示符,然后运行“ sdkmanager --update”,这将更新您的sdk,然后您需要运行“ flutter doctor- -android-licenses”并接受所有许可证。
现在您的问题应该解决了。
答案 21 :(得分:1)
@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
答案 22 :(得分:0)
更新了我当前的 Android SDK,一切都非常棒。
答案 23 :(得分:0)
我遇到了同样的问题,并按照建议安装了openjdk-8-jdk
。检查javac -version
得到的版本正确,但是java -version
显示的是版本11。
解决方案是使用:
sudo update-alternatives --config java
,然后从菜单中选择版本8。
答案 24 :(得分:0)
这个问题有很多答案,而且由于用户安装了不同的工具链并使用了不同的Java版本,所以答案也有所不同。
使用Android开发工具链的推荐方法,或者至少是我建议使用的一种方法,是遵循Android Studio文档中的规定:
您应该始终通过使用Android SDK管理器下载最新版本来更新构建工具组件。
Android Studio允许您轻松管理已安装的SDK和构建工具,是的,它在硬盘驱动器上需要一些空间,但可以节省一些时间。熟悉其工作原理后,您可以考虑只安装命令行工具。
如果没有特殊原因使用较旧的Java版本,请使用最新的(稳定)版本,您将拥有有趣的新功能,并且编译后的应用程序将从所有新的优化中受益。
Android
文件夹,通常在主目录中Settings
,搜索Android SDK
,然后打开SDK Platforms
中为您的应用选择目标Android版本SDK Tools
标签中,选择Android SDK Build-Tools
,Android SDK Command-line Tools (latest)
,Android Emulator
,Android SDK Platform-Tools
Android SDK Location
路径是否适合您(可选),如果需要从命令行使用已安装的二进制文件,请确保将其文件夹添加到PATH变量中。如果您使用的是Android Studio,则不需要。
我已经在计算机上安装了Java 14,无论如何您都可以使用Android Studio随附的jre。
答案 25 :(得分:0)
我的 Java 版本是 15.0.1 。适用于 Mac 操作系统。
这就是我解决问题的方法。
下载的 zip:jaf-1_1_1.zip 来自:https://download.oracle.com/otn-pub/java/jaf/1.1.1/jaf-1_1_1.zip?AuthParam=1609860571_68ca6f30491c76e81970a3849504fb6a
解压到一个文件夹: ~/jars/ 。导出的类路径如下
export
CLASSPATH=~/jars/FastInfoset.jar:~/jars/activation.jar:~/jars/codemodel.jar:~/jars/dtd-parser.jar:~/jars/istack-commons-runtime.jar:~/jars/istack-commons-tools.jar:~/jars/jaf-1.1.1:~/jars/jaf-1_1_1.zip:~/jars/javax.activation-api.jar:~/jars/jaxb-api.jar:~/jars/jaxb-jxc.jar:~/jars/jaxb-ri:~/jars/jaxb-ri-2.3.1.zip:~/jars/jaxb-runtime.jar:~/jars/jaxb-xjc.jar:~/jars/relaxng-datatype.jar:~/jars/rngom.jar:~/jars/stax-ex.jar:~/jars/txw2.jar:~/jars/xsom.jar
cd ~/Library/Android/sdk/tools/bin/sdkmanager
将 CLASSPATH 更改为以下内容CLASSPATH=$CLASSPATH:$APP...
保存文件并再次运行命令。
答案 26 :(得分:0)
无需卸载计算机上已经安装的其他Java版本。无论何时需要,您都可以方便地使用实用程序“ update-alternatives”来选择要激活的Java运行时。它将自动更新所需的符号链接。
您只需要运行以下命令并选择所需的版本。仅此而已!
sudo update-alternatives --config java
答案 27 :(得分:0)
最好的方法是使用以下命令
$ wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
$ unzip \platform-tools-latest-linux.zip
$ sudo cp platform-tools/adb /usr/bin/adb
$ sudo cp platform-tools/fastboot /usr/bin/fastboot
现在运行adb版本以验证其已更新。
答案 28 :(得分:0)
对于我来说,我正在使用sdkman管理多个Java版本。我将默认Java版本设置为13。安装版本8,现在可以正常使用了。
答案 29 :(得分:0)
答案 30 :(得分:0)
我遇到了同样的问题。虽然我有点落后,但是仍然使用Windows来开发:P。
要在Windows上解决此问题,
如果尚未安装jdk 8,请安装它(jdk 9或11无法使用,但您可能已经安装了它们,以用于其他开发用途)。
步骤1:转到“环境变量”设置,并将JAVA_HOME设置为jdk 8的安装目录。
第2步:转到路径变量,然后添加jdk 8的bin目录,并将其移至顶部。
第3步:重新启动计算机。
步骤4:打开Powershell并写入(您到应用程序数据的路径)... \ AppData \ Local \ Android \ sdk \ tools \ bin \ sdkmanager --update
仅此而已:O。享受飘飘:D。
答案 31 :(得分:0)
当您的Android stuio / jre使用不同版本的Java时,您会收到此错误。要解决此问题,只需将Android studio / jre设置为您的JAVA_HOME。并卸载自己的Java。
答案 32 :(得分:0)
答案 33 :(得分:0)
运行时遇到同样的问题
$ / Users // 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 // Library / Android / sdk / tools / bin / sdkmanager“ platforms; android-28”“ build-tools; 28.0.3”