Error al instalar android-sdk: "java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema"


166

Al instalar las herramientas de Android SDK, se emite el siguiente error:

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

¿Por qué sucede esto y cómo se puede solucionar?

Salida de depuración:

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

Supongo que su pregunta es "¿Qué está causando este error?" La respuesta es que no puede encontrar las clases javax.xml.
Steve Smith

28
En realidad, esta pregunta plantea un problema legítimo con la instalación de Android SDK cuando se tiene java9
jontro

17
Tengo este problema y copié / pegué la primera línea de mi mensaje de error en Google, y esta pregunta fue el primer éxito que surgió. No solo eso, una de las respuestas a continuación lo resolvió. Esto no debería cerrarse por completo: no importa cuáles sean las reglas de las preguntas, esta pregunta cumple de manera demostrable con todo el propósito del sitio.
Le Mot Juiced

1
Eliminar cualquier cosa anterior a Java 8 de/Library/Java/JavaVirtualMachines
Dimitris

2
El problema ocurre con Java 8 y Java 11 en Ubuntu 18.04 usando paquetes openjdk-8-jdky openjdk-11-jdk. ¿Alguien sabe para qué instalar javax/xml/bind/annotation/XmlSchemao cómo evitar javax/xml/bind/annotation/XmlSchemaen el NDK?
jww

Respuestas:


138

Tuve un problema similar esta mañana (tratando de construir para Android usando Unity3D). Terminé desinstalando JDK9 e instalando Java SE Development Kit 8u144 . Espero que esto ayude.

  1. brew cask uninstall java # desinstalar java9
  2. brew tap homebrew/cask-versions
  3. brew cask install java8 # instalar java8
  4. touch ~/.android/repositories.cfg # sin este archivo, se producirá un error en el siguiente paso
  5. brew cask install android-sdk

2
Recibí el error en Windows 10, probé esto, todavía no funciona. ¿Algun consejo?
Vedvart1

3
Genial: esto funcionó para mí al crear una aplicación Flutter en Android Studio. ¡Gracias!
Darragh Enright

20
Esto dejó de funcionar, brew cask install java8 no funciona.
kdy

44
el comando correcto parece ser ahorabrew cask install homebrew/cask-versions/java8
caesarsol

21
brew cask install homebrew/cask-versions/adoptopenjdk8parece funcionar
guruz

82

Para resolver este error, puede degradar su versión de Java.

O exporta la siguiente opción en su terminal:

Linux / MAC:

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

Ventanas :

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

Y para guardarlo permanentemente, puede exportarlo JAVA_OPTSen su archivo de perfil en Linux ( .zshrc, .bashrcy etc.) o agregarlo como variable de entorno permanentemente en Windows.


PD. Esto no funciona para Java 11+, que no tiene módulos Java EE. Para esta opción es una buena idea, degradar su versión de Java o esperar una actualización de Flutter .

Ref: JDK 11: Fin del camino para módulos Java EE


66
Esto funcionó para mí en Ubuntu 18.04 con OpenJDK 10.0.2
comenzó el

3
Me funcionó en macOS Mojave (10.14.2) con la versión de Java "10.0.1" 2018-04-17.
Subfuzion

44
Creó un nuevo error para mí en macOS Mojave (10.14.2): Se produjo un error durante la inicialización de la capa de arranque java.lang.module.FindException: Módulo java.se.ee no encontrado
Randy

2
También probé 1.8.0_191, pero aún obtengo: Error: No se pudo encontrar o cargar la clase principal java.se.ee
Randy

1
Esta opción no es necesaria para Java 8 y no funciona para Java 11, que no tiene módulos Java EE.
valdeci

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

Esto solucionó el problema en Windows para mí.

Fuente 1 , fuente 2


2
También usé esto en ubuntu 16.04 (usando exportnot set) y resolvió el problema.
Benjamin Conlan

Genio. Muchas gracias. Pensé que iba a tener que cambiar mi JVM
copos


44
Desafortunadamente, eso parece haberse eliminado por completo en Java 11.
Alastair Maw

Trabajé haciendo export JAVA_OPTS = '-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'en Ubuntu 18.04
e2-e4

25

Si no desea cambiar su versión de Java (yo no), puede cambiar temporalmente la versión en su shell:

Primer intento

/usr/libexec/java_home -V

Luego, elija una versión principal si la tiene instalada; de lo contrario, instálela primero:

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

Ahora puedes ejecutar sdkmanager.


2
$ /usr/libexec/java_home -Vda bash: /usr/libexec/java_home: No such file or directory. apt-file search /usr/libexec/java_homeno da exactamente nada
Tino

¿Tiene $ JAVA_HOME configurado correctamente? Ejecutar: echo "export JAVA_HOME=`/usr/libexec/java_home`" >> ~/.bashrc(o perfil si usa perfil) - recargar:. ~/.bashrc
Sarah A

No hay /usr/libexectampoco. ¿Estás en MacOS? (Estoy en Ubuntu / Linux y Ubuntu / Windows)
Tino

Estoy usando mac ¿Dónde está tu Java_home?
Sarah A

21

En Mac / Linux use el siguiente comando:

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

Funciona para JDK 9 y 10, sin parchear ningún script (sdkmanager, avdmanager).

Para Java 11 ver: https://stackoverflow.com/a/51644855/798165


1
¡Gracias! resuelve el problema cuando has instalado jdk 9
Jorge Valvert

15

Encontré dos respuestas que me funcionaron, sin tener que desinstalar JDK 10 (o 9), que necesito create-react-app. ¡Tanto JDK 9 como 10 son incompatibles con android-sdk!


Siu Ching Pong -Asuka Kenji- sugiere modificar el sdkmanagerguión, reemplazando esta línea:

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'

Tenga en cuenta que este mod se sobrescribirá al actualizar sdkmanager.
Echa un vistazo a su publicación, y a la que está vinculado, para más detalles.
Esta solución también fue una de las soluciones mencionadas en este hilo de problemas de github .


La publicación de German indica la fuente del conflicto y presenta una solución que las actualizaciones no sobrescribirán.
Sugiere cambiar el nombre /Library/Java/JavaVirtualMachines/Info.plistcomo una forma de ocultarlo del script que busca la versión más alta de Java que reside en su sistema. De esta manera, JDK 8 se devuelve como predeterminado.
Refiriéndose a JDK 10 explícitamente, o configurándolo en $JAVA_HOME, puede usar JDK 10, en lugar del predeterminado, siempre que sea necesario.
Los detalles están en su publicación.


1
Funcionó perfectamente, la mejor solución en mi humilde opinión, ya que no te obliga a degradar Java
niveles

De alguna manera, después de experimentar mucho con ao. Android Studio, este problema desapareció y el nuevo error fue Could not find or load main class java.se.ee: revertir el DEFAULT_JVM_OPTS solucionó esto y el problema anterior desapareció ..
niveles

3
Desafortunadamente, esto no funciona ahora. El resultado es: Se produjo un error durante la inicialización de la capa de arranque java.lang.module.FindException: Módulo java.se.ee no encontrado
Oscar

1
Upvoted stackoverflow.com/a/49630166/5411817 por tener la solución correcta para mantener jdk-11 y jdk1.8 instalados sin degradar
harrisjb

15

Debe agregar lo siguiente a su Perfil (Funciona en MacOS):

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

No es necesario parchear nada.


15

Simplemente instale JDK versión 8 y selecciónelo como predeterminado usando:

sudo update-alternatives --config java

10

Actualización 2019-10:

Como se indica en el rastreador de problemas , Google ha estado trabajando en un nuevo SDK de Android Herramientas de línea de comandos versión de las que se ejecuta en las JVM actuales (9, 10, 11+) y no depende de módulos JAXB EE obsoletos.

Puede descargar y usar las nuevas herramientas de línea de comandos del SDK de Android dentro de Android Studio o descargándolas manualmente de los servidores de Google:

Para las últimas versiones, verifique las URL dentro del repository.xml .

Si desempaqueta manualmente las herramientas de línea de comandos, asegúrate de colocarlas en una subcarpeta dentro de tu $ANDROID_HOME(por ejemplo $ANDROID_HOME/cmdline-tools/...).


¡Al usar Java 9+, esta debería ser la respuesta de ahora en adelante!
Luiggi Mendoza

9

Extrañamente Java9 no es compatible 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

Combinó todos los comandos en uno para una referencia fácil:

$ 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

Como Java 11 ha eliminado JavaEE, deberá descargar algunos archivos jar y agregarlos al classpath:

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

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

Luego edite sdkmanager.bat para que el conjunto CLASSPATH = ... termine con ;% CLASSPATH%

Establezca CLASSPATH para incluir JAXB y JAF:

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

Entonces sdkmanager.bat funcionará.


Funciona, pero recibo esta advertencia: ADVERTENCIA: Acceso reflexivo ilegal por com.sun.xml.bind.v2.runtime.reflect.opt.Injector (archivo: / F: / android_sdk / java / jaxb-ri / lib / jaxb -impl.jar) al método java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int)
AndyMc

Ya, parece que Java está comenzando a advertir contra la mala práctica de programación de usar la reflexión para eludir la seguridad de clase, que JAXB usa (Oracle rompe sus propias reglas);)
Peter Quiring

4

Me encontré con el mismo problema al ejecutar:

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

Lo resolví como

$ 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

Cambiar Java para usar 1.8

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

Entonces el mismo comando funciona bien

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

Este es el mejor caso. Si ya exportas JAVA_OPTS. Primero quítelo antes de seguir los pasos de esta respuesta.
Espada Jason el

4

Me enfrenté al mismo problema. Aunque soy un desarrollador un poco anticuado (Todavía uso Windows para desarrollar: P)

Para resolver este problema en Windows :

PASO 1: instale jdk 8 si no estaba instalado (jdk 9 u 11 no funciona pero puede tenerlos instalados para usar en otros usos de desarrollo).

Muy simple usando Chocolatey:

instalar choco jdk8

(Si se instala con Chocolatey, omita los pasos 2 y 3)

PASO 2: vaya a la configuración de las variables de entorno y establezca JAVA_HOME TO jdk 8's directorio de instalación.

JAVA_HOME

PASO 3: Vaya a la variable de ruta y agregue el directorio bin de jdk 8 y muévalo hacia arriba.

Path_varriable

PASO 4: cierre cualquier sesión de terminal abierta y reinicie una nueva sesión

PASO OPCIONAL 5: Dependiendo de su objetivo en la ejecución del terminal (puede que necesite agregar sdkmanager a la ruta o simplemente navegar al directorio):

sdkmanager --update

¡Eso es todo! : ¡Oh, disfruta revoloteando! :RE


1
¡Esto junto con la respuesta principal funcionó para mí en Windows 10!
mauriii

GRACIASSSSSSSSSSSSS
Raghav Joshi

2

Para la máquina Windows, desinstale el JDK si es más de 1.8.172. Instalar JDK 1.8.172

Estaba enfrentando el mismo problema en Windows 10 con Java 10. Desinstalé el Java 10 e instalé Java8, funciona bien para mí ahora :)


2

Para usuarios de Linux (estoy usando una distribución Debian, Kali) Así es como resolví la mía.

Si aún no tiene jdk-8, desea obtenerlo en el sitio de Oracle

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

Tengo el jdk-8u191-linux-x64.tar.gz

Paso 1 - Instalar Java Move y descomprimirlo en una ubicación adecuada como esta

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

Debería obtener una carpeta descomprimida como jdk1.8.0_191. Luego puede eliminar el tarball para ahorrar espacio

Paso 2: configuración de alternativas a la ubicación predeterminada de 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

Paso 3: selección de alternativas como predeterminadas

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

Paso 4: confirmar la versión predeterminada de Java

$ java -version

Notas

  1. En el artículo original aquí: https://forums.kali.org/showthread.php?41-Installing-Java-on-Kali-Linux , también se configuró el complemento predeterminado para mozilla. Supongo que realmente no necesitamos los complementos, ya que simplemente estamos tratando de desarrollar para Android.
  2. Como en la respuesta de @ spassvogel, también debe colocar un archivo @ repositories.cfg en su directorio ~ / .android, ya que es necesario para actualizar las listas de repositorios de herramientas
  3. Mover algunas cosas puede requerir autoridad de raíz. Usa sudo sabiamente.
  4. Para el uso de sdkmanager, consulte la guía oficial: https://developer.android.com/studio/command-line/sdkmanager

1

Correr java -versionyjavac -version comandos en una línea de comandos para asegurarse de que provienen del mismo JDK (por ejemplo: versión 1.8.0_181)

De lo contrario, debe modificar la PATHvariable para que solo apunte a un solo JDK. Si no está seguro de cómo hacerlo, simplemente desinstale todas las demás instancias de Java excepto Java 8 (Agregar o quitar programas en Windows). En cuanto a hoy, tanto Unity como Android recomiendan que use JDK 8.

Con Java 8, no es necesario exportar el java.se.eemódulo como se muestra en algunas de las otras respuestas. También puede eliminar cualquiera JAVA_OPTSu otras variables de entorno que haya establecido.


1

Recientemente resolví este problema desinstalando la versión superior de JDK e instalando JDK 8. Después de instalar el JDK, debe indicar la ruta. Luego debe abrir el símbolo del sistema en "C: \ Users \ Milan Adhikari \ AppData \ Local \ Android \ Sdk \ tools" y ejecutar "sdkmanager --update" que actualizará su sdk y luego deberá ejecutar "flutter doctor - -android-licens "en cmd y acepta todas las licencias.
Ahora tu problema debería estar resuelto.


1

En mi caso, necesito JDK 8 (tratando de usar el administrador de AVD y SDK en Qt en ubuntu) y 11 para diferentes herramientas. Eliminar la versión 11 no es una opción.

Las soluciones 'JAVA_OPTS' no hicieron nada. Realmente no me gusta la exportación JAVA_HOME, ya que podría forzarlo a iniciar cualquier herramienta que llame a estas utilidades desde el mismo shell (como Qt), o forzarlo a que sea permanente, lo que no es conveniente.

Entonces para mí la solución es bastante simple. Agregue algo como esto en la segunda línea de ~ / Android / tools / bin / sdkmanager y ~ / Android / tools / bin / avdmanager:

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

(o cualquiera que sea el camino hacia tu rev ​​8 jdk).

Con esto, estas herramientas de línea de comando funcionan en modo autónomo, también funcionan cuando son llamadas por otras herramientas como Qt, y jdk 11 sigue siendo el valor predeterminado del sistema para otros. No es necesario mezclar libs, etc.

El único inconveniente es que cualquier actualización de estas herramientas de línea de comandos borrará estas modificaciones, que tendrá que volver a colocar.


¡PARTE SUPERIOR! ¡gracias!
Financiador

0

Baje la versión de Java. Cualquiera sea el sistema o ide.

Asegúrese de que la versión de Java no sea superior a 8

En mi caso, cambio la versión de ide java. Esto resuelve mi problema. ingrese la descripción de la imagen aquí


0

Cuando su Android stuio / jre utiliza una versión diferente de Java, recibirá este error. para resolverlo, solo configure Android studio / jre en su JAVA_HOME. y desinstale su propio java.


0

Para mí, instalo la versión 8 de Java y solo selecciono la versión de Java en "Ubicación JDK": ingrese la descripción de la imagen aquí


0

Para mi circunstancia, estoy usando sdkman para administrar múltiples versiones de Java. Configuré la versión predeterminada de Java en 13. Instale la versión 8 y ahora funciona bien.


0

La mejor manera es usar el siguiente comando

   $ 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

Ahora ejecute la versión adb para verificar que se haya actualizado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.