Error al instalar android-sdk: "java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema"
java-9 (16)
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)
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%
Configure CLASSPATH para incluir JAXB y JAF:
set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar
Entonces sdkmanager.bat funcionará.
Cuando su Android stuio / jre usa 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.
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.
Ejecute los comandos
java -version
y
javac -version
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 variable
PATH
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 módulo
java.se.ee
como se muestra en algunas de las otras respuestas.
También puede eliminar cualquier
JAVA_OPTS
u otras
variables de entorno
que haya establecido.
En el uso de Mac / Linux:
export JAVA_OPTS=''-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee''
Funciona para JDK 9 y 10, sin parchear ningún script (sdkmanager, avdmanager)
Encontré dos respuestas que me funcionaron, sin tener que desinstalar JDK 10 (o 9), que necesito para
create-react-app
.
¡Tanto JDK 9 como 10 son incompatibles con android-sdk!
Siu Ching Pong -Asuka Kenji-
sugiere modificar el script
sdkmanager
, 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 de
/Library/Java/JavaVirtualMachines/Info.plist
como un medio para ocultarlo del script que busca la versión más alta de Java que reside en su sistema.
De esta forma, 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.
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.
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 :)
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 exportar
JAVA_OPTS
en su archivo de perfil en Linux (
.zshrc
,
.bashrc
y etc.) o agregarlo como 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 update Flutter.
Para usuarios de Linux (estoy usando una distribución de 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: seleccionar las 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
- 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.
- 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
- Mover algunas cosas puede requerir autoridad de raíz. Usa sudo sabiamente.
- Para el uso de sdkmanager, consulte la guía oficial: https://developer.android.com/studio/command-line/sdkmanager
Se encontró con el mismo problema al ejecutar
$ / Users // Library / Android / sdk / tools / bin / sdkmanager "plataformas; android-28" "build-tools; 28.0.3"
Lo resolvió 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''
Luego, el mismo comando funciona bien $ / Users // Library / Android / sdk / tools / bin / sdkmanager "plataformas; android-28" "build-tools; 28.0.3"
Si no quieres cambiar tu 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
Simplemente instale JDK versión 8 y selecciónelo como predeterminado usando:
sudo update-alternatives --config java
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.
-
brew cask uninstall java
# desinstalar java9 -
brew tap caskroom/versions
-
brew cask install java8
# install java8 -
touch ~/.android/repositories.cfg
# sin este archivo, se producirá un error en el siguiente paso -
brew cask install android-sdk
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
Esto solucionó el problema en Windows para mí.
Fuente 1 , fuente 2