Impossibile installare android-sdk: "java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema"


167

Durante l'installazione degli strumenti Android SDK viene emesso il seguente errore:

java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema

Perché sta succedendo e come può essere risolto?

Uscita di debug:

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

Presumo che la tua domanda sia "Cosa sta causando questo errore?" La risposta è che non riesce a trovare le classi javax.xml.
Steve Smith,

28
In realtà questa domanda pone un problema legittimo con l'installazione di Android SDK quando si ha java9
jontro

17
Ho questo problema e ho copiato / incollato la prima riga del mio messaggio di errore su Google, e questa domanda è stata la prima volta che è arrivata. Non solo, una delle risposte qui sotto l'ha risolto. Questo non dovrebbe assolutamente essere chiuso: indipendentemente dalle regole delle domande, questa domanda soddisfa in modo dimostrabile l'intero scopo del sito.
Le Mot Juiced,

1
Elimina qualcosa di più vecchio di Java 8 da/Library/Java/JavaVirtualMachines
Dimitris

2
Il problema si verifica con Java 8 e Java 11 su Ubuntu 18.04 utilizzando i pacchetti openjdk-8-jdke openjdk-11-jdk. Qualcuno sa cosa installare javax/xml/bind/annotation/XmlSchemao come evitare javax/xml/bind/annotation/XmlSchemain NDK?
1919

Risposte:


138

Ho avuto un problema simile stamattina (cercando di creare per Android usando Unity3D). Ho finito per disinstallare JDK9 e installare Java SE Development Kit 8u144 . Spero che questo ti aiuti.

  1. brew cask uninstall java # Uninstall java9
  2. brew tap homebrew/cask-versions
  3. brew cask install java8 # installa java8
  4. touch ~/.android/repositories.cfg # senza questo file, si verificherà un errore al passaggio successivo
  5. brew cask install android-sdk

2
Ho ricevuto l'errore su Windows 10, provato questo, ancora non funziona. Qualche consiglio?
Vedvart1,

3
Fantastico: questo ha funzionato per me nella creazione di un'app Flutter in Android Studio. Grazie!
Darragh Enright,

20
Questo ha smesso di funzionare, brew cask install java8 non funziona.
kdy,

4
il comando corretto sembra essere adessobrew cask install homebrew/cask-versions/java8
caesarsol il

21
brew cask install homebrew/cask-versions/adoptopenjdk8sembra funzionare
guruz,

82

Per risolvere questo errore, è possibile eseguire il downgrade della versione di Java.

Oppure esporta la seguente opzione sul tuo terminale:

Linux / Mac:

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

Windows :

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

E per salvare in modo permanente è possibile esportazioni JAVA_OPTSnel file profilo su Linux ( .zshrc, .bashrce così via) o aggiungere come variabile d'ambiente in modo permanente su Windows.


ps. Questo non funziona con Java 11+, che non ha moduli Java EE. Per questa opzione è una buona idea, eseguire il downgrade della versione di Java o attendere un aggiornamento di Flutter .

Rif: JDK 11: Fine della strada per i moduli Java EE


6
Questo ha funzionato per me in Ubuntu 18.04 w / OpenJDK 10.0.2
rastating il

3
Ha funzionato per me su macOS Mojave (10.14.2) con la versione Java "10.0.1" 2018-04-17.
Subfuzion,

4
Creato un nuovo errore per me su macOS Mojave (10.14.2): si è verificato un errore durante l'inizializzazione del livello di avvio java.lang.module.FindException: Modulo java.se.ee non trovato
Randy

2
Ho anche provato 1.8.0_191, ma sto ancora ottenendo: Errore: Impossibile trovare o caricare la classe principale java.se.ee
Randy

1
Questa opzione non è necessaria per Java 8 e non funziona per Java 11, che non ha moduli Java EE.
valdeci,

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

Ciò ha risolto il problema su Windows per me.

Fonte 1 , fonte 2


2
Utilizzato anche su Ubuntu 16.04 (usando exportnot set) e risolto il problema.
Benjamin Conlan,

Genio. Grazie mille. Pensavo che avrei dovuto cambiare la mia JVM
sfalda il

1
Ha funzionato come un fascino su Windows 10 con Java 10
pabz,

4
Sfortunatamente sembra che sia stato completamente rimosso in Java 11.
Alastair Maw,

Ha lavorato export JAVA_OPTS = '-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'su Ubuntu 18.04
e2-e4 il

25

Se non vuoi cambiare la tua versione di Java (io no), puoi cambiare temporaneamente la versione nella tua shell:

Prima corsa

/usr/libexec/java_home -V

Quindi scegli una versione principale se è installata, altrimenti installala prima:

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

Ora puoi eseguire sdkmanager.


2
$ /usr/libexec/java_home -Vbash: /usr/libexec/java_home: No such file or directory. apt-file search /usr/libexec/java_homenon dà esattamente niente.
Tino,

$ JAVA_HOME è impostato correttamente? Esegui: echo "export JAVA_HOME=`/usr/libexec/java_home`" >> ~/.bashrc(o profilo se usi il profilo) - ricarica:. ~/.bashrc
Sarah A

Non c'è /usr/libexecneanche. Sei su MacOS? (Sono su Ubuntu / Linux e Ubuntu / Windows)
Tino

Sto usando mac. dov'è la tua Java_home?
Sarah A

21

Su Mac / Linux utilizzare il comando seguente:

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

Funziona sia con JDK 9 che 10, senza patchare nessuno script (sdkmanager, avdmanager).

Per Java 11, consultare: https://stackoverflow.com/a/51644855/798165


1
Grazie! risolve il problema dopo aver installato jdk 9
Jorge Valvert il

15

Ho trovato due risposte che hanno funzionato per me, senza dover disinstallare JDK 10 (o 9), di cui ho bisogno create-react-app. Sia JDK 9 che 10 sono incompatibili con Android-SDK!


Siu Ching Pong -Asuka Kenji- suggerisce di modificare la sdkmanagersceneggiatura, sostituendo questa riga:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'  

con:

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

Nota che questa mod verrà sovrascritta durante l'aggiornamento di sdkmanager.
Controlla il suo post e quello a cui si collega per maggiori dettagli.
Questa soluzione era anche una delle soluzioni menzionate in questo thread sui problemi di github .


Il post tedesco indica l'origine del conflitto e presenta una correzione che non verrà sovrascritta dagli aggiornamenti.
Suggerisce di rinominare /Library/Java/JavaVirtualMachines/Info.plistcome mezzo per oscurarlo dallo script che cerca la versione più alta di Java che risiede sul tuo sistema. In questo modo, JDK 8 viene restituito come predefinito.
Facendo riferimento a JDK 10 in modo esplicito o impostandolo su $JAVA_HOME, è possibile utilizzare JDK 10, anziché l'impostazione predefinita, quando necessario.
I dettagli sono nel suo post.


1
Ha funzionato perfettamente, la migliore soluzione IMHO in quanto non ti costringe a downgrade java
livelli

In qualche modo, dopo aver sperimentato molto con ao. Android Studio, questo problema è scomparso e il nuovo errore era Could not find or load main class java.se.ee: il ripristino di DEFAULT_JVM_OPTS risolto questo problema e il problema precedente è andato via.
livelli

3
Sfortunatamente, questo non funziona ora. Il risultato è: si è verificato un errore durante l'inizializzazione del livello di avvio java.lang.module.FindException: modulo java.se.ee non trovato
Oscar

1
Upvoted stackoverflow.com/a/49630166/5411817 per avere la soluzione corretta per mantenere jdk-11 e jdk1.8 installato senza declassamento
harrisjb

15

Devi aggiungere quanto segue al tuo profilo (Funziona su MacOS):

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

Non c'è bisogno di patchare nulla.


15

Installa semplicemente JDK versione 8 e selezionalo come predefinito usando:

sudo update-alternatives --config java

11

Aggiornamento 2019-10:

Come indicato nel tracker dei problemi , Google ha lavorato su un nuovo strumento della riga di comando dell'SDK per Android che gira su JVM attuali (9, 10, 11+) e non dipende da moduli EAX JAXB obsoleti!

Puoi scaricare e utilizzare i nuovi strumenti da riga di comando dell'SDK per Android all'interno di Android Studio o scaricandoli manualmente dai server di Google:

Per le versioni più recenti controlla gli URL all'interno di repository.xml .

Se decomprimi manualmente gli strumenti della riga di comando, assicurati di inserirli in una sottocartella all'interno del tuo $ANDROID_HOME(ad es $ANDROID_HOME/cmdline-tools/....).


1
Quando si utilizza Java 9+, questa dovrebbe essere la risposta da ora in poi!
Luiggi Mendoza,

9

Stranamente Java9 non è compatibile con 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

Combina tutti i comandi in uno per un facile riferimento:

$ 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

Poiché Java 11 ha rimosso JavaEE, dovrai scaricare alcuni vasetti e aggiungerli al percorso di classe:

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

JAF: https://www.oracle.com/technetwork/articles/java/index-135046.html

Quindi modifica sdkmanager.bat in modo che set CLASSPATH = ... termini con ;% CLASSPATH%

Impostare CLASSPATH per includere JAXB e JAF:

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

Quindi sdkmanager.bat funzionerà.


Funziona, ma ricevo questo avviso: ATTENZIONE: accesso riflettente illegale da com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file: / F: / android_sdk / java / jaxb-ri / lib / jaxb -impl.jar) al metodo java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int)
AndyMc

Sì, sembra che Java stia iniziando a mettere in guardia contro le cattive pratiche di programmazione dell'uso della riflessione per bypassare la sicurezza della classe, che JAXB usa (Oracle infrange le proprie regole);)
Peter Quiring,

5

Ho affrontato lo stesso problema. Anche se sono uno sviluppatore un po 'datato (sto ancora usando Windows per sviluppare: P)

Per risolvere questo problema su Windows :

PASSAGGIO 1: Installa jdk 8 se non è stato installato (jdk 9 o 11 non funziona ma potresti averli installati per l'utilizzo in altri usi di sviluppo).

Molto semplice usando Chocolatey:

choco installa jdk8

(Se installato utilizzando Chocolatey, saltare i passaggi 2 e 3)

PASSAGGIO 2: vai alle impostazioni delle variabili di ambiente e imposta JAVA_HOME sulla directory di installazione di jdk 8.

JAVA_HOME

PASSAGGIO 3: vai alla variabile percorso e aggiungi la directory bin di jdk 8 e spostala in alto.

Path_varriable

PASSAGGIO 4: chiudere eventuali sessioni del terminale aperte e riavviare una nuova sessione

FASE 5 FACOLTATIVA: a seconda dell'obiettivo nella corsa del terminale (potrebbe essere necessario aggiungere sdkmanager al percorso o semplicemente passare alla directory):

sdkmanager: aggiornamento

È tutto! : O Divertiti svolazzando! : D


1
Questo insieme alla risposta migliore ha funzionato per me su Windows 10!
mauriii,

GRAZIESSSSSSSSSSSS
Raghav Joshi il

Lavori! Voglio solo aggiungere che, se si utilizza il codice VS, è necessario riavviare il programma dopo questa modifica
Antonio Reyes

4

Ho riscontrato lo stesso problema durante l'esecuzione:

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"_

L'ho risolto come

$ 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

Cambia Java per usare 1.8

$ export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home'

Quindi lo stesso comando funziona bene

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

Questo è il caso migliore. Se esporti già JAVA_OPTS. Rimuovilo prima di eseguire i passaggi da questa risposta.
Sword Jason,

2

Per i computer Windows, disinstallare JDK se è superiore all'1.8.172. Installa JDK 1.8.172

Stavo affrontando lo stesso problema in Windows 10 con Java 10. Ho disinstallato Java 10 e installato Java 8 ora funziona bene per me :)


2

Per utenti Linux (sto usando un Debian Distro, Kali) Ecco come ho risolto il mio.

Se non hai già jdk-8, vuoi scaricarlo sul sito di Oracle

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Ho preso il jdk-8u191-linux-x64.tar.gz

Passaggio 1: installazione di Java Move e decompressione in una posizione adatta in questo modo

$ mv jdk-8u191-linux-x64.tar.gz /suitablelocation/
$ tar -xzvf /suitablelocation/jdk-8u191-linux-x64.tar.gz

Dovresti ottenere una cartella decompressa come jdk1.8.0_191 Successivamente puoi eliminare il tarball per risparmiare spazio

Passaggio 2: impostare alternative alla posizione java predefinita

$ 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

Passaggio 3: selezione delle alternative come predefinite

$ update-alternatives --set java /suitablelocation/jdk1.8.0_191/bin/java
$ update-alternatives --set javac /suitablelocation/jdk1.8.0_191/bin/javac

Passaggio 4: conferma della versione java predefinita

$ java -version

Appunti

  1. Nell'articolo originale qui: https://forums.kali.org/showthread.php?41-Installing-Java-on-Kali-Linux , è stato impostato anche il plugin predefinito per mozilla. Suppongo che non abbiamo davvero bisogno dei plugin in quanto stiamo semplicemente cercando di sviluppare per Android.
  2. Come nella risposta di @ spassvogel, dovresti anche inserire un file @ repositories.cfg nella tua directory ~ / .android poiché è necessario per aggiornare gli elenchi di repository degli strumenti
  3. Spostare alcune cose può richiedere l'autorità di root. Usa saggiamente sudo.
  4. Per l'utilizzo di sdkmanager, consultare la guida ufficiale: https://developer.android.com/studio/command-line/sdkmanager

1

Esegui java -versione javac -versioncomandi in una riga di comando per assicurarti che provengano dallo stesso JDK (ad es. Versione 1.8.0_181)

In caso contrario, è necessario modificare la PATHvariabile in modo che punti solo a un singolo JDK. In caso di dubbi, disinstallare tutte le altre istanze Java ad eccezione di Java 8 (Installazione applicazioni in Windows). Ad oggi, sia Unity che Android consiglia di utilizzare JDK 8.

Con Java 8, non è necessario esportare il java.se.eemodulo come mostrato in alcune delle altre risposte. È inoltre possibile rimuovere qualsiasi JAVA_OPTSo altre variabili di ambiente impostate.


1

Di recente avevo risolto questo problema disinstallando la versione successiva di JDK e installando JDK 8. Dopo aver installato JDK è necessario indicare il percorso. Quindi devi aprire il prompt dei comandi in "C: \ Users \ Milan Adhikari \ AppData \ Local \ Android \ Sdk \ tools" ed eseguire "sdkmanager --update" che aggiornerà il tuo SDK e quindi dovrai eseguire "flutter doctor - -android-licences "in cmd e accetta tutte le licenze.
Ora il tuo problema dovrebbe essere risolto.


1

Nel mio caso, ho bisogno sia di JDK 8 (cercando di utilizzare il gestore AVD e SDK in Qt sotto Ubuntu) sia di 11 per diversi strumenti. La rimozione della versione 11 non è un'opzione.

Le soluzioni "JAVA_OPTS" non hanno fatto nulla. Non mi piace molto l'esportazione JAVA_HOME, in quanto potrebbe costringerti a lanciare qualsiasi strumento chiama questi programmi di utilità dalla stessa shell (come Qt) o costringerti a renderlo permanente, il che non è conveniente.

Quindi per me la soluzione è abbastanza semplice. Aggiungi qualcosa del genere nella seconda riga di ~ / Android / tools / bin / sdkmanager e ~ / Android / tools / bin / avdmanager:

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

(o qualunque sia il percorso verso il tuo rev 8 jdk).

Con questo, questi strumenti da riga di comando funzionano in modalità autonoma, funzionano anche quando chiamati da altri strumenti come Qt, e jdk 11 è ancora il sistema predefinito per altri. Non c'è bisogno di mescolare libs ecc ...

L'unico aspetto negativo è che qualsiasi aggiornamento a questi strumenti da riga di comando cancellerà queste modifiche, che dovrai reinserire.


SUPERIORE! grazie!
Finanziatore

0

Esegui il downgrade della tua versione java. Qualunque sistema o ide.

Assicurarsi che la versione java non sia superiore a 8

Nel mio caso, cambio l'ide java verion, questo risolve il mio problema. inserisci qui la descrizione dell'immagine


0

Quando il tuo Android stuio / jre utilizza una versione diversa di java, riceverai questo errore. per risolverlo, basta impostare Android studio / jre sul tuo JAVA_HOME. e disinstalla il tuo java.



0

Per la mia circostanza, sto usando sdkman per gestire più versioni java. Ho impostato la versione java predefinita su 13. Installa la versione 8 e ora funziona bene.


0

Il modo migliore è usare il comando seguente

   $ 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

Ora esegui la versione adb per verificare che sia stata aggiornata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.