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


166

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

我假设您的问题是“什么导致此错误?” 答案是它找不到javax.xml类。
史蒂夫·史密斯

28
实际上,这个问题在拥有java9时提出了安装android sdk的合法问题
jontro

17
我遇到了这个问题,我将错误消息的第一行复制/粘贴到了google中,这个问题是第一个出现的问题。不仅如此,下面的答案之一解决了它。这完全不应该被关闭:无论问题的规则是什么,这个问题都可以完全实现站点的全部目的。
Le Mot

1
/Library/Java/JavaVirtualMachines
Dimitris

2
在Ubuntu 18.04上使用软件包openjdk-8-jdk和的Java 8和Java 11会出现问题openjdk-11-jdk。有谁知道要安装什么javax/xml/bind/annotation/XmlSchema,或如何避免javax/xml/bind/annotation/XmlSchema在NDK中安装?
jww

Answers:


138

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

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

2
在Windows 10上出现错误,尝试过此操作,仍然不起作用。有小费吗?
Vedvart1

3
太好了-这对我在Android Studio中构建Flutter应用程序很有用。谢谢!
Darragh Enright

20
这样就停止工作了,brew cask install java8无法正常工作。
kdy19年

4
正确的命令似乎是现在brew cask install homebrew/cask-versions/java8
caesarsol

21
brew cask install homebrew/cask-versions/adoptopenjdk8似乎有效
guruz

81

要解决此错误,您可以降级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 EE模块的Java 11+。使用此选项是一个好主意,请降级Java版本或等待Flutter 更新

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


6
这在Ubuntu 18.04 w / OpenJDK 10.0.2中为我工作
还原了

3
我在2018年4月17日在Java版本为“ 10.0.1”的macOS Mojave(10.14.2)上为我工作。
Subfuzion

4
在macOS Mojave(10.14.2)上为我创建了一个新错误:初始化启动层java.lang.module.FindException时发生错误:找不到模块java.se.ee
Randy

2
我也尝试了1.8.0_191,但仍然得到:错误:无法找到或加载主类java.se.ee
Randy

1
Java 8不需要此选项,而Java 11没有Java EE模块,则该选项不起作用。
valdeci '19

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

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

来源1来源2


2
在ubuntu 16.04上也使用了它(export不使用set),它解决了问题。
本杰明·康兰

天才。非常感谢。以为我得改变我的JVM

1
在使用Java 10的Windows 10上像魅力一样工作
pabz

4
不幸的是,似乎已经完全用Java 11删除
阿拉斯泰尔鱼鳔

工作export JAVA_OPTS = '-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'在Ubuntu 18.04
e2-e4

25

如果您不想更改Java版本(我不想),则可以在Shell中临时更改版本:

第一次运行

/usr/libexec/java_home -V

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

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

现在您可以运行sdkmanager。


2
$ /usr/libexec/java_home -Vbash: /usr/libexec/java_home: No such file or directoryapt-file search /usr/libexec/java_home什么也没给出。
蒂诺

您是否正确设置了$ JAVA_HOME?运行:(echo "export JAVA_HOME=`/usr/libexec/java_home`" >> ~/.bashrc或使用个人资料,则使用个人资料)-重新加载:. ~/.bashrc
莎拉(Sarah)

也没有/usr/libexec。您在MacOS上吗?(我在Ubuntu / Linux和Ubuntu / Windows上)
Tino

我正在使用mac。您的Java_home在哪里?
莎拉


15

我找到了两个对我有用的答案,而不必卸载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"'  

与:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

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


German的帖子指出了冲突的根源,并提出了不会被更新覆盖的修复程序。
他建议将重命名/Library/Java/JavaVirtualMachines/Info.plist作为一种手段来掩饰它,该脚本会寻找系统中驻留的Java最高版本。这样,JDK 8将作为默认值返回。
显式引用JDK 10或将其设置为$JAVA_HOME,可以在需要时使用JDK 10而不是默认值。
详细信息在他的帖子中。


1
完美工作,最好的解决方案恕我直言,因为它不会迫使您降级Java

不知何故,在对ao进行了大量实验之后。Android Studio,这个问题消失了,新的错误是Could not find or load main class java.se.ee-恢复DEFAULT_JVM_OPTS修复了这个问题,上一个问题消失了
。–

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

1
推荐使用stackoverflow.com/a/49630166/5411817,以提供正确的解决方案来保持jdk-11和jdk1.8的安装而不降级
harrisjb,

15

您需要在个人资料中添加以下内容(在MacOS上适用):

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

无需打补丁。


15

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

sudo update-alternatives --config java

10

更新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/...)。


从现在开始,使用Java 9+时,应该就是答案!
Luiggi Mendoza

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

将所有命令组合在一起,以方便参考:

$ 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.

8

由于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

然后sdkmanager.bat将起作用。


它可以正常工作,但会收到以下警告:警告:com.sun.xml.bind.v2.runtime.reflect.opt.Injector(文件:/ F:/ android_sdk / java / jaxb-ri / lib / jaxb被非法反射访问-impl.jar)到方法java.lang.ClassLoader.defineClass(java.lang.String,byte [],int,int)
AndyMc

是的,Java似乎开始警告使用反射来绕过类安全性的不良编程实践,JAXB使用了这种反射(Oracle违反了他们自己的规则);)
Peter Quiring 18/12/10

4

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

$ /Users/<username>/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/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"

这是最好的情况。如果您已经导出了JAVA_OPTS。在执行此答案中的步骤之前,请先将其删除。
Sword Jason

4

我遇到了同样的问题。虽然我有点落后,但仍然使用Windows开发:P

在Windows上解决此问题:

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

使用Chocolatey非常简单:

choco安装jdk8

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

步骤2:转到环境变量设置,并将JAVA_HOME设置为jdk 8的安装目录。

JAVA_HOME

步骤3:转到路径变量,然后添加jdk 8的bin目录,并将其移至顶部。

路径可变

步骤4:关闭所有打开的终端会话,然后重新启动新会话

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

sdkmanager-更新

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


1
这与最佳答案一起在Windows 10上为我工作!
mauriii

THANKSSSSSSSSSSSSSSSS
Raghav Joshi

2

对于Windows计算机,如果JDK大于1.8.172,则将其卸载。安装JDK 1.8.172

我在带有Java 10的Windows 10中遇到了相同的问题。我现在卸载了Java 10并安装了Java8,它对我来说现在可以正常使用了:)


2

对于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 Move,然后在合适的位置解压缩它

$ 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

笔记

  1. 在此处的原始文章中:https : //forums.kali.org/showthread.php? 41-Installing-Java-on-Kali-Linux,还设置了mozilla的默认插件。我认为我们真的不需要插件,因为我们只是在尝试为Android开发。
  2. 就像在@spassvogel的答案中一样,您还应该在〜/ .android目录中放置一个@ repositories.cfg文件,因为这是更新工具仓库列表所必需的
  3. 四处移动可能需要root权限。明智地使用sudo。
  4. 有关sdkmanager的用法,请参见官方指南:https : //developer.android.com/studio/command-line/sdkmanager

1

在命令行中运行java -versionjavac -version命令,以确保它们来自同一JDK(例如:1.8.0_181版)

如果不是,则必须修改PATH变量,使其仅指向单个JDK。如果不确定如何安装,只需卸载Java 8(Windows中的“添加/删除程序”)以外的所有其他Java实例。对于今天,Unity和Android都建议您使用JDK 8。

使用Java 8时,不必java.se.ee像其他一些答案中所示导出模块。您也可以删除已设置的任何JAVA_OPTS或其他环境变量


1

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


1

就我而言,我需要同时使用JDK 8(尝试在ubuntu下的Qt中使用AVD和SDK管理器)和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仍然是其他人的系统默认设置。无需混合库等...

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


最佳!谢谢!
资助者

0

降级您的Java版本。无论是哪种系统或ide。

确保Java版本不高于8

就我而言。我更改了ide java版本,这解决了我的问题。 在此处输入图片说明




0

对于我的情况,我正在使用sdkman来管理多个Java版本。我将默认Java版本设置为13。安装版本8,现在可以正常使用了。


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版本以验证它已被更新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.