无法安装android-sdk:"java.lang.NoClassDefFoundError:javax/xml/bind/annotation/XmlSchema"

Nov*_*tor 134 java android java-9

安装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)
Run Code Online (Sandbox Code Playgroud)

EdY*_*uTo 316

刚刚出现这个错误,通过Android SDK Command-line Tools (latest)在Android Studio上下载Preferences > Appearance & Behavior > System Settings > Android SDK > SDK Tools并重新运行解决flutter doctor --android-licenses

Android Studio 上的 Android SDK 路径

命令行工具

最后,.bashrc在过时的工具之前,将新工具添加到您的 PATH,在您的或类似的路径中:

export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
Run Code Online (Sandbox Code Playgroud)

  • 在我的 macOS 上,除了所解释的内容之外,我还必须将 `PATH` 中的 `$ANDROID_HOME/tools/bin` 移动到 `$ANDROID_HOME/cmdline-tools/latest/bin` 之后,因为那里有失败的 sdkmanager/avdmanager 二进制文件 (5认同)
  • 尝试了上述解决方案,但 2021 年在新安装的环境中没有任何效果。这对我来说是正确的答案。 (4认同)
  • Ubuntu 21 完美唤醒 (3认同)
  • 这应该标记为正确答案。降级Java不是正确的做法,这是高度倒退的! (3认同)
  • 现在,Android Studio 上没有名为“首选项”的选项。“系统设置”现在在文件中可用 (2认同)

spa*_*gel 106

今天早上我遇到了类似的问题(尝试使用Unity3D为Android构建).我最终卸载了JDK9并安装了Java SE Development Kit 8u144.希望这可以帮助.

  1. brew cask uninstall java #uninstall java9
  2. brew tap caskroom/versions
  3. brew cask install java8 #install java8
  4. touch ~/.android/repositories.cfg #没有此文件,下一步将发生错误
  5. brew cask install android-sdk

  • 这样就停止工作了,酿造桶安装java8无法正常工作。 (13认同)
  • `brew cask install homebrew / cask-versions / adoptopenjdk8'似乎有效 (6认同)
  • 我必须使用 ```brew install --cask homebrew/cask-versions/adoptopenjdk8``` 而不是 ```brew cask install java8``` (5认同)
  • 正确的命令现在似乎是`brew cask install homebrew/cask-versions/java8` (4认同)
  • 在 Windows 10 上出现错误,试过了,仍然无效。有小费吗? (2认同)
  • 太棒了 - 这对我在Android Studio中构建Flutter应用程序非常有用.谢谢! (2认同)
  • 这与 Java 版本无关。这是关于“命令行工具”的。安装命令行工具后,我通过了此错误 Java 16。您还可以在该问题的第二页找到正确答案。`Android Studio -&gt; SDK 管理器 -&gt; SDK 工具 -&gt; Android SDK 命令行工具 -&gt; 安装` (2认同)

Roh*_*aki 88

  • 我也有这个错误
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
Run Code Online (Sandbox Code Playgroud)
  • 然后不是卸载最新的java环境,(在我的例子中是java 13)
  • 和安装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

在此处输入图片说明

在此处输入图片说明 在此处输入图片说明

  • 重启命令行工具 在此处输入图片说明

  • 输入命令 flutter doctor

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

  • 并通过键入接受所有许可证 y

在此处输入图片说明

  • 谢谢!很好奇你是怎么想出来的。 (7认同)
  • 是的,你是怎么想出来的。救生员 (4认同)
  • 最后,一个有效的解决方案。我非常感谢你发布这个! (2认同)
  • 非常感谢,这拯救了我的一天。在此之前我做了一个噩梦。 (2认同)

cod*_*ade 64

要解决此错误,您可以降级Java版本.

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

Linux的/ MAC:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Run Code Online (Sandbox Code Playgroud)

Windows:

set JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Run Code Online (Sandbox Code Playgroud)

要永久保存它,您可以JAVA_OPTS在Linux(等等)上导出配置文件.zshrc,.bashrc或在Windows上永久添加为环境.


PS.这不适用于没有Java EE模块的Java 11+.对于此选项是一个好主意,降级Java版本.

参考:JDK 11:Java EE模块的终点

  • 这在Ubuntu 18.04 w/OpenJDK 10.0.2中适用于我 (6认同)
  • 不工作,java.lang.module.FindException:找不到模块 java.se.ee (5认同)
  • 我也尝试过 1.8.0_191,但仍然得到:错误:找不到或加载主类 java.se.ee (4认同)
  • 在适用于Java版本为“ 10.0.1”的macOS Mojave(10.14.2)上为我工作了2018-04-17。 (3认同)
  • Java 8 不需要此选项,也不适用于没有 Java EE 模块的 Java 11。 (3认同)
  • 在macOS Mojave(10.14.2)上为我创建了一个新错误:初始化启动层java.lang.module.FindException时发生错误:找不到模块java.se.ee (2认同)
  • 在窗口语法中,您不能使用撇号,只需: set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee 但它不能开箱即用: java.lang.module.FindException: Module java.se .ee 未找到 (2认同)

Tim*_*ßen 61

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
Run Code Online (Sandbox Code Playgroud)

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

来源1,来源2

  • 不幸的是,这似乎已在Java 11中完全删除。 (3认同)
  • 也在ubuntu 16.04上使用它(使用`export` not`set`)并解决了这个问题. (2认同)

G00*_*0fY 40

2019-10 更新:

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

您可以在 Android Studio 中下载和使用新的Android SDK 命令行工具,也可以从 Google 服务器手动下载它们:

对于最新版本,请检查repository.xml 中的 URL 。

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

2021-03 更新:

最新的稳定命令行工具可从Google 下载网站 获得。这些工具比上面链接的工具更新。

  • 当使用 Java 9+ 时,这应该是从现在开始的答案! (4认同)
  • @RohanDevaki `c:\Users\用户名\AppData\Local\Android\Sdk\cmdline-tools\latest\bin\sdkmanager.bat` (2认同)

Pri*_*ain 21

在构建 flutter 应用程序时发生错误,提示 android sdk 许可证不被接受。因此,在接受许可证时发生了此错误。

在我的例子中,出现此错误的原因是我尚未安装接受许可证所需的 sdkmanager 命令行工具。

因此,安装命令行工具最简单的方法是:

  1. 打开安卓工作室。
  2. 打开SDK管理器(参见下图): 在此输入图像描述
  1. 在栏中选择里面的SDK工具。
  2. 勾选 Android SDK 命令行工具(最新)选项
  3. 应用它。
  4. 如果使用 flutter,请运行 flutter doctor -android-licenses,或者您可以继续发生错误的过程。


oor*_*ori 17

在Mac/Linux上使用:
__CODE__

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

  • 谢谢!当您安装 jdk 9 时它解决了问题 (2认同)

She*_*man 13

我找到了两个对我有用的答案,而不必卸载我需要的JDK 10(或9)create-react-app.JDK 9和10都与android-sdk不兼容!


Siu Ching Pong -Asuka Kenji-建议修改sdkmanager脚本,替换此行:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'  
Run Code Online (Sandbox Code Playgroud)

有:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Run Code Online (Sandbox Code Playgroud)

请注意,更新sdkmanager时将覆盖此mod.
查看他的帖子以及他链接到的帖子,了解更多详情.
此解决方案也是此github问题线程中提到的解决方案之一.


德语的帖子表明了冲突的根源,并提供了不会被更新覆盖的修复.
他建议重命名/Library/Java/JavaVirtualMachines/Info.plist,以便从查找系统中最高版本Java的脚本中隐藏它.这样,JDK 8将作为默认值返回.
明确地参考JDK 10,或者通过将其设置为$JAVA_HOME,您可以在需要时使用JDK 10而不是默认值.
细节在他的帖子中.

  • 不幸的是,这现在不起作用。结果是:在启动层java.lang.module.FindException的初始化期间发生错误:找不到模块java.se.ee (2认同)

Far*_*eed 13

您需要将以下内容添加到您的配置文件(适用于MacOS):

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
Run Code Online (Sandbox Code Playgroud)

无需修补任何东西.


Sar*_*h A 12

如果您不想更改Java版本(我不想)。您可以在外壳中临时更改版本:

首轮

/usr/libexec/java_home -V
Run Code Online (Sandbox Code Playgroud)

然后选择一个主要版本(如果已安装),否则请首先安装它:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
Run Code Online (Sandbox Code Playgroud)

现在您可以运行sdkmanager。

  • $ / usr / libexec / java_home -V给出bash:/ usr / libexec / java_home:没有这样的文件或目录。apt文件搜索/ usr / libexec / java_home完全不提供任何内容。 (2认同)

Wel*_*ith 9

奇怪的是,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
Run Code Online (Sandbox Code Playgroud)

将所有命令合并为一个以便于参考:

$ 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.
Run Code Online (Sandbox Code Playgroud)


Ste*_*ven 8

只需安装JDK版本8并使用以下命令将其选择为默认版本:

sudo update-alternatives --config java
Run Code Online (Sandbox Code Playgroud)


THE*_*IUM 8

我遇到了同样的问题。虽然我是一个有点过时的开发人员(仍在使用 Windows 进行开发:P)

在 Windows 上解决此问题:

第 1 步:如果未安装 jdk 8,请安装它(jdk 9 或 11 不起作用,但您可以安装它们以用于其他开发用途)。

使用 Chocolatey 非常简单:

巧克力安装jdk8

(如果使用 Chocolatey 安装,请跳过步骤 2 和 3)

STEP 2:进入Environment variables settings,将JAVA_HOME设置为jdk 8的安装目录。

JAVA_HOME

STEP 3: 进入路径变量并添加 jdk 8 的 bin 目录并将其移至顶部。

路径变量

第 4 步:关闭所有打开的终端会话并重新启动新会话

可选步骤 5:根据您在终端运行中的目标(可能需要将 sdkmanager 添加到路径或仅导航到目录):

sdkmanager --update

就这样!:O 享受飘飘!:D

  • 这与最重要的答案一起在 Windows 10 上对我有用! (2认同)
  • 作品!我只是想补充一点,如果你使用的是 VS code,则必须在更改后重新启动程序 (2认同)

Pet*_*ing 7

由于Java 11删除了JavaEE,因此您需要下载一些jar并将其添加到类路径中:

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

JAF: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
Run Code Online (Sandbox Code Playgroud)

然后sdkmanager.bat将起作用。


San*_*eep 6

我在运行时遇到了同样的问题:

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"_
Run Code Online (Sandbox Code Playgroud)

我解决了它

$ 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
Run Code Online (Sandbox Code Playgroud)

将 Java 更改为使用 1.8

$ export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home'
Run Code Online (Sandbox Code Playgroud)

然后相同的命令运行良好

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"
Run Code Online (Sandbox Code Playgroud)


Wil*_*l59 5

就我而言,对于不同的工具,我需要 JDK 8(尝试在 ubuntu 下的 Qt 中使用 AVD 和 SDK 管理器)和 11。删除版本 11 不是一个选项。

“JAVA_OPTS”解决方案没有执行任何操作。我不太喜欢导出 JAVA_HOME,因为它可能会强制您从同一个 shell(如 Qt)启动调用这些实用程序的任何工具,或者强制您将其永久化,这很不方便。

所以对我来说解决方案非常简单。在 ~/Android/tools/bin/sdkmanager 和 ~/Android/tools/bin/avdmanager 的第二行添加类似的内容:

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

(或者任何版本 8 jdk 的路径)。

这样,这些命令行工具就可以在独立模式下工作,在被 Qt 等其他工具调用时也可以工作,并且 jdk 11 仍然是其他工具的系统默认值。无需混合库等...

唯一的缺点是,对这些命令行工具的任何更新都会删除这些修改,您必须将其放回原处。


Enr*_*ené 5

就我而言,我有 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/

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


1. 找出我的 Java 在哪里:

# which java
/usr/bin/java
Run Code Online (Sandbox Code Playgroud)

2.检查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
Run Code Online (Sandbox Code Playgroud)

3. 检查defaultdefault-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
Run Code Online (Sandbox Code Playgroud)

4.切换默认版本

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

# rm default default-runtime
Run Code Online (Sandbox Code Playgroud)

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

# ln -s java-8-openjdk default
# ln -s java-8-openjdk default-runtime
Run Code Online (Sandbox Code Playgroud)

该策略是使用上面的方法链接到所需版本的软件(在本例中为 java8)ln -s。然后,此链接将链接到 java bin 目录内的二进制文件(无需更改$PATH环境变量!


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


jbg*_*jbg 5

从最新版本的 Android 命令行工具(撰写本文时为 2.1)开始,不再需要修补 sdkmanager 或降级到旧版本的 Java。

只需更新您的 SDK 包并将命令行工具切换到latest发行版,该发行版将跟踪新版本的发布:

sdkmanager --update
sdkmanager 'cmdline-tools;latest'
sdkmanager --uninstall 'cmdline-tools;1.0'
Run Code Online (Sandbox Code Playgroud)

sdkmanager如果它不在您的 上,您可能需要提供完整路径,如果它明确引用工具PATH,您可能需要事后调整您的路径。PATH1.0