Lors de l'installation des outils Android sdk, l'erreur suivante est générée:
Java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
Pourquoi cela se produit-il et comment peut-il être corrigé?
Sortie de débogage:
$ 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)
J'ai eu un problème similaire ce matin (en essayant de construire pour Android en utilisant Unity3D). J'ai fini par désinstaller JDK9 et installer Java SE Development Kit 8u144 . J'espère que cela t'aides.
brew cask uninstall Java
# désinstaller Java9brew tap caskroom/versions
brew cask install Java8
# installer Java8touch ~/.Android/repositories.cfg
# sans ce fichier, une erreur se produira à l'étape suivantebrew cask install Android-sdk
Pour résoudre cette erreur, vous pouvez rétrograder votre version Java.
Ou exporte l'option suivante sur votre terminal:
Linux/MAC:
export Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Windows :
set Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Et pour le sauvegarder en permanence, vous pouvez exporter le Java_OPTS
dans votre fichier de profil sous Linux (.zshrc
, .bashrc
et etc.) ou ajouter un environnement de manière permanente sous Windows.
ps. Cela ne fonctionne pas pour le Java 11+, qui n'a pas Java EE modules. Pour que cette option soit une bonne idée, rétrogradez votre version Java ou attendez un Flutter pdate .
Sur Mac/Linux, utilisez:export Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Fonctionne à la fois pour JDK 9 et 10, sans patcher un script (sdkmanager, avdmanager)
J'ai trouvé deux réponses qui fonctionnaient pour moi, sans avoir à désinstaller JDK 10 (ou 9), ce dont j'ai besoin pour create-react-app
. JDK 9 et 10 sont incompatibles avec Android-sdk!
Siu Ching Pong - Asuka Kenji - suggère de modifier le script sdkmanager
, en remplaçant cette ligne:
DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME"'
avec:
DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
Notez que ce mod sera écrasé lors de la mise à jour de sdkmanager.
Découvrez son message et celui sur lequel il renvoie, pour plus de détails.
Cette solution était également l'une des solutions mentionnées dans ce thread de github issues .
Le message de l'allemand indique la source du conflit et présente un correctif qui ne sera pas écrasé par les mises à jour.
Il suggère de renommer /Library/Java/JavaVirtualMachines/Info.plist
afin de le masquer à partir du script recherchant la version la plus récente de Java résidant sur votre système. De cette manière, JDK 8 est renvoyé par défaut.
En vous référant explicitement à JDK 10, ou en le définissant sur $Java_HOME
, vous pouvez utiliser JDK 10 à la place de la valeur par défaut, si nécessaire.
Les détails sont dans son message.
Vous devez ajouter les éléments suivants à votre profil (Fonctionne sous MacOS):
export Java_HOME=`/usr/libexec/Java_home -v 1.8`
Pas besoin de patcher quoi que ce soit.
Étrangement, Java9 n'est pas compatible avec 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
Combiné toutes les commandes en une seule pour faciliter la référence:
$ 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.
Installez simplement JDK version 8 et sélectionnez-le par défaut en utilisant:
Sudo update-alternatives --config Java
Si vous ne voulez pas changer votre version de Java (je ne le fais pas). Vous pouvez modifier temporairement la version dans votre shell:
première exécution
/usr/libexec/Java_home -V
puis choisissez une version majeure si vous l'avez installée, sinon installez-la d'abord:
export Java_HOME=`/usr/libexec/Java_home -v 1.8`
Maintenant vous pouvez lancer sdkmanager
Puisque Java 11 a supprimé JavaEE, vous devez télécharger des fichiers JAR et les ajouter au chemin de classe:
JAXB: https://javaee.github.io/jaxb-v2/
JAF: https://www.Oracle.com/technetwork/articles/Java/index-135046.html
Editez ensuite sdkmanager.bat de sorte que définissez CLASSPATH = ... se termine par ;% CLASSPATH%
Définissez CLASSPATH pour inclure JAXB et JAF:
set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar
Ensuite, sdkmanager.bat fonctionnera.
Exécutez les commandes Java -version
et javac -version
dans une ligne de commande pour vous assurer qu'elles proviennent du même JDK (par exemple: version 1.8.0_181).
Sinon, vous devez modifier la variable PATH
afin qu'elle ne pointe que sur un seul JDK. Si vous ne savez pas comment procéder, désinstallez toutes les autres instances Java, à l'exception de Java 8 (Ajout/Suppression de programmes sous Windows). À l’heure actuelle, Unity et Android vous recommandent d’utiliser JDK 8.
Avec Java 8, il n’est pas nécessaire d’exporter le module Java.se.ee
comme indiqué dans certaines des autres réponses. Vous pouvez également supprimer tout Java_OPTS
ou autre variables d'environnement que vous avez défini.
Pour la machine Windows, désinstallez le JDK s'il est supérieur à 1.8.172. Installer le JDK 1.8.172
Je faisais face au même problème dans Windows 10 avec Java 10. J'ai désinstallé le Java 10 et installé Java8, il fonctionne parfaitement pour moi maintenant :)
Pour les utilisateurs de Linux (j'utilise une distribution Debian, Kali) Voici comment j'ai résolu le mien.
Si vous ne possédez pas déjà jdk-8, vous voulez l'obtenir sur le site d'Oracle
https://www.Oracle.com/technetwork/Java/javase/downloads/jdk8-downloads-2133151.html
J'ai le jdk-8u191-linux-x64.tar.gz
Étape 1 - Installation de Java Déplacez-le et décompressez-le à un emplacement approprié, comme ceci
$ mv jdk-8u191-linux-x64.tar.gz /suitablelocation/
$ tar -xzvf /suitablelocation/jdk-8u191-linux-x64.tar.gz
Vous devriez obtenir un dossier non compressé comme jdk1.8.0_191. Vous pouvez ensuite supprimer l’archive pour économiser de l’espace.
Étape 2 - Configuration des alternatives à l'emplacement par défaut 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
Étape 3 - Sélection de vos alternatives par défaut
$ update-alternatives --set Java /suitablelocation/jdk1.8.0_191/bin/Java
$ update-alternatives --set javac /suitablelocation/jdk1.8.0_191/bin/javac
Étape 4 - Confirmation de la version par défaut de Java
$ Java -version
Remarques
A couru dans le même problème lors de l'exécution
$/Utilisateurs // Bibliothèque/Android/sdk/tools/bin/sdkmanager "plates-formes; Android-28" "build-tools; 28.0.3"
Résolu en tant que $ echo $ Java_HOME /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
$ ls/Bibliothèque/Java/JavaMachines Virtuelles /
jdk-11.0.1.jdk
jdk1.8.0_202.jdk
Change Java pour utiliser 1.8
$ export Java_HOME = '/ Bibliothèque/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Sommaire/Accueil'
Ensuite, la même commande se déroule parfaitement $/Utilisateurs // Bibliothèque/Android/sdk/tools/bin/sdkmanager "plateformes; Android-28" "build-tools; 28.0.3"
Lorsque votre Android stuio/jre utilise une version différente de Java, vous recevrez cette erreur. pour le résoudre, il suffit de définir Android studio/jre sur votre Java_HOME. et désinstaller votre propre Java.