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

问题描述 投票:88回答:15

安装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)
java android java-9
15个回答
96
投票

今天早上我遇到了类似的问题(尝试使用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

5
投票

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

sudo update-alternatives --config java

1
投票

对于Windows机器卸载JDK,如果它超过1.8.172。安装JDK 1.8.172

我在Windows 10中遇到了与java 10相同的问题。我卸载了java 10并安装了java8,它现在正常工作:)


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或其他environment variables


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

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”


0
投票

降级你的java版本。无论是什么系统或ide。

确保java版本不高于8

在我的情况下。我改变了ide java版本。这解决了我的问题。 qazxsw poi


0
投票

当您的Android studio / jre使用不同版本的java时,您将收到此错误。要解决它,只需将Android studio / jre设置为您的JAVA_HOME即可。并卸载自己的java。


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

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

Source 1source 2


50
投票

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

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

Linux的/ MAC:

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

视窗:

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

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


PS。这不适用于没有Java EE模块的Java 11+。对于这个选项是一个好主意,降级Java版本或等待Flutter update

参考:JDK 11: End of the road for Java EE modules


14
投票

在Mac / Linux上使用: export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

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


12
投票

我找到了两个对我有用的答案,无需卸载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 issues thread中提到的解决方案之一。


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


12
投票

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

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

无需修补任何东西。


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.

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以便设置CLASSPATH = ...以;%CLASSPATH%结束

设置CLASSPATH以包含JAXB和JAF:

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

然后sdkmanager.bat将工作。


5
投票

如果你不想改变你的Java版本(我没有)。您可以临时更改shell中的版本:

第一次运行

/usr/libexec/java_home -V

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

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

现在你可以运行sdkmanager了

© www.soinside.com 2019 - 2024. All rights reserved.