Bei der Installation der SDK-Tools Android wird der folgende Fehler ausgegeben:
Java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
Warum passiert das und wie kann es behoben werden?
Debug-Ausgabe:
$ 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)
Ich hatte heute Morgen ein ähnliches Problem (ich habe versucht, mit Unity3D für Android zu bauen). Am Ende habe ich JDK9 deinstalliert und Java SE Development Kit 8u144 installiert. Hoffe das hilft.
brew cask uninstall Java
# Java9 deinstallierenbrew tap caskroom/versions
brew cask install Java8
# Java8 installierentouch ~/.Android/repositories.cfg
# Ohne diese Datei tritt beim nächsten Schritt ein Fehler aufbrew cask install Android-sdk
Um diesen Fehler zu beheben, können Sie Ihre Version Java downgraden.
Oder exportiert die folgende Option auf Ihrem Terminal:
Linux/MAC:
export Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Windows :
set Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Und um es dauerhaft zu speichern, können Sie den Java_OPTS
in Ihre Profildatei unter Linux (.zshrc
, .bashrc
und usw.) exportieren oder unter Windows dauerhaft als Umgebung hinzufügen.
ps. Dies funktioniert nicht für den Java 11+, der keinen Java EE hat Module. Für diese Option ist es eine gute Idee, ein Downgrade Ihrer Java-Version durchzuführen oder auf ein Flattern zu warten pdate .
Unter Mac/Linux verwenden Sie:export Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Funktioniert sowohl für JDK 9 als auch für JDK 10, ohne Patchen eines Skripts (sdkmanager, avdmanager)
Ich fand zwei Antworten, die für mich funktionierten, ohne JDK 10 (oder 9) deinstallieren zu müssen, das ich für create-react-app
benötige. Sowohl JDK 9 als auch 10 sind nicht mit Android-sdk kompatibel!
Siu Ching Pong -Asuka Kenji - schlägt vor, das sdkmanager
-Skript zu ändern und diese Zeile zu ersetzen:
DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME"'
mit:
DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Beachte, dass dieser Mod beim Update von sdkmanager überschrieben wird.
Überprüfen Sie seinen Post und den, auf den er verweist, auf weitere Details.
Diese Lösung war auch eine der Lösungen, die in diesem Thema zu Github-Problemen erwähnt wurden.
Deutscher Beitrag gibt die Ursache des Konflikts an und zeigt einen Fix an, der durch Updates nicht überschrieben wird.
Er schlägt vor, /Library/Java/JavaVirtualMachines/Info.plist
umzubenennen, um es aus dem Skript zu verdunkeln, das nach der höchsten Version von Java sucht, die sich auf Ihrem System befindet. Auf diese Weise wird JDK 8 als Standard zurückgegeben.
Wenn Sie explizit auf JDK 10 Bezug nehmen oder es auf $Java_HOME
setzen, können Sie bei Bedarf JDK 10 anstelle der Standardeinstellung verwenden.
Details finden Sie in seinem Beitrag.
Sie müssen Ihrem Profil Folgendes hinzufügen (funktioniert unter MacOS):
export Java_HOME=`/usr/libexec/Java_home -v 1.8`
Sie müssen nichts patchen.
Seltsamerweise ist Java9 nicht mit Android-sdk kompatibel
$ 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
Kombiniert alle Befehle zu einem für eine einfache Referenz:
$ 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.
Installieren Sie einfach JDK Version 8 und wählen Sie es als Standard aus:
Sudo update-alternatives --config Java
Wenn Sie Ihre Java -Version nicht ändern möchten (ich nicht). Sie können die Version in Ihrer Shell vorübergehend ändern:
erster Lauf
/usr/libexec/Java_home -V
wählen Sie dann eine Hauptversion aus, wenn Sie sie installiert haben, andernfalls installieren Sie sie zuerst:
export Java_HOME=`/usr/libexec/Java_home -v 1.8`
Jetzt können Sie sdkmanager ausführen
Da Java 11 JavaEE entfernt hat, müssen Sie einige Gläser herunterladen und zum Klassenpfad hinzufügen:
JAXB: https://javaee.github.io/jaxb-v2/
JAF: https://www.Oracle.com/technetwork/articles/Java/index-135046.html
Dann editiere sdkmanager.bat so, dass set CLASSPATH = ... endet mit ;% CLASSPATH%
Stellen Sie CLASSPATH so ein, dass es JAXB und JAF enthält:
set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar
Dann funktioniert sdkmanager.bat.
Führen Sie die Befehle Java -version
und javac -version
in einer Befehlszeile aus, um sicherzustellen, dass sie von demselben JDK stammen (z. B. Version 1.8.0_181).
Andernfalls müssen Sie die Variable PATH
so ändern, dass sie nur auf ein einzelnes JDK verweist. Wenn Sie sich nicht sicher sind, wie Sie vorgehen sollen, deinstallieren Sie einfach alle anderen Java Instanzen mit Ausnahme von Java 8 (Software in Windows). Derzeit empfehlen sowohl Unity als auch Android die Verwendung von JDK 8.
Mit Java 8 ist es nicht erforderlich, das Java.se.ee
-Modul zu exportieren, wie in einigen anderen Antworten gezeigt. Sie können auch Java_OPTS
oder andere mgebungsvariablen entfernen, die Sie festgelegt haben.
Für Windows-Computer deinstallieren Sie das JDK, wenn es höher als 1.8.172 ist. Installieren Sie JDK 1.8.172
Ich hatte das gleiche Problem in Windows 10 mit Java 10. Ich habe Java 10 deinstalliert und Java8 installiert. Es funktioniert jetzt einwandfrei für mich :)
Für Linux-Benutzer (ich verwende eine Debian-Distribution, Kali) Hier ist, wie ich meine gelöst habe.
Wenn Sie jdk-8 noch nicht haben, möchten Sie es bei Oracle herunterladen
https://www.Oracle.com/technetwork/Java/javase/downloads/jdk8-downloads-2133151.html
Ich habe die jdk-8u191-linux-x64.tar.gz
Schritt 1 - Installation von Java Verschieben Sie das Gerät und packen Sie es an einem geeigneten Ort aus
$ mv jdk-8u191-linux-x64.tar.gz /suitablelocation/
$ tar -xzvf /suitablelocation/jdk-8u191-linux-x64.tar.gz
Sie sollten einen entpackten Ordner wie jdk1.8.0_191 erhalten. Sie können das Archiv anschließend löschen, um Speicherplatz zu sparen
Schritt 2 - Einrichten von Alternativen zum Standardverzeichnis 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
Schritt 3 - Auswahl Ihrer Alternativen als Standard
$ update-alternatives --set Java /suitablelocation/jdk1.8.0_191/bin/Java
$ update-alternatives --set javac /suitablelocation/jdk1.8.0_191/bin/javac
Schritt 4 - Bestätigen der Standardversion Java
$ Java -version
Anmerkungen
Beim Laufen auf dasselbe Problem gestoßen
$/Users // Library/Android/sdk/tools/bin/sdkmanager "Plattformen; Android-28" "Build-Tools; 28.0.3"
Gelöst als $ 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
Ändern Sie Java in 1.8
$ export Java_HOME = '/ Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home'
Dann läuft der selbe Befehl einwandfrei $/Users // Library/Android/sdk/tools/bin/sdkmanager "Plattformen; Android-28" "Build-Tools; 28.0.3"
Wenn Ihr Android Studio/jre eine andere Java-Version verwendet, wird dieser Fehler angezeigt. Um das Problem zu lösen, setzen Sie Android studio/jre auf Ihr Java_HOME. und deinstalliere dein eigenes Java.