manager - java lang noclassdeffounderror javax xml ws service
Error al ejecutar sdkmanager--list(Android SDK) con Java 9 (9)
Al tener Java 11 en el sistema, las soluciones proporcionadas no son válidas.
Esto
-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or
--add-modules java.xml.bind no funcionan con Java 11 en Mac OS.
Por esa razón, debe degradar la versión de Java a la versión 8 desde aquí: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Lista de versiones de Java instaladas
/usr/libexec/java_home -V
Java 11
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
Java 1.8
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
Luego ve a
cd ~/Library/Android/sdk/tools/bin
y
./sdkmanager --licenses
Descargué e instalé:
-
JDK (
jdk-9.0.1_osx-x64_bin.dmg
) de Oracle here -
Android SDK (
sdk-tools-darwin-3859397.zip
) de Google here .
Después de configurar la variable
PATH
, intenté ejecutar
sdkmanager
, que reemplazó el comando de
android
para administrar los componentes del SDK.
Sin embargo, falló como se muestra aquí:
$ sdkmanager --list
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
Aquí está la versión de Java:
$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
¿Alguien sabe cómo solucionarlo sin volver a Java 8?
preguntas relacionadas
-
Error al instalar android-sdk
- Esta publicación hizo una pregunta similar. Sin embargo, la publicación está cerrada y la única respuesta sugiere volver a Java 8.
Como leemos en los comentarios anteriores, este error se produce porque la versión actual del SDK es incompatible con las versiones más recientes de Java: 9 y 10.
Entonces, para resolverlo, puede degradar su versión de Java al Java 8 o, como solución alternativa, puede exportar la siguiente opción en su terminal:
Linux:
export JAVA_OPTS=''-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee''
Ventanas :
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee''
Esto resolverá este error para el
sdkmanager
Y para que se guarde permanentemente, puede exportar JAVA_OPTS en su archivo de perfil en Linux (
.zshrc
,
.bashrc
y etc.) o agregarlo como variable de entorno de forma permanente 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.
Con la ayuda de esta respuesta , resolví el problema con éxito.
Vamos a aplicar una solución en
sdkmanager
.
Es un script de shell.
Se encuentra en
$android_sdk/tools/bin
, donde
$android_sdk
es donde descomprimió el SDK de Android.
-
Abra
sdkmanager
en su editor favorito. -
Localice la línea que establece la variable
DEFAULT_JVM_OPTS
. En mi copia, está en la línea 31:DEFAULT_JVM_OPTS=''"-Dcom.android.sdklib.toolsdir=$APP_HOME"''
-
Agregue las siguientes opciones a la variable:
-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
Por favor, preste atención a las citas. En mi copia, la línea se convierte en:DEFAULT_JVM_OPTS=''"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee''
- Guarde el archivo y salga del editor.
- Ejecute el comando nuevamente.
Aquí está el resultado:
$ sdkmanager --list
Installed packages:
Path | Version | Description | Location
------- | ------- | ------- | -------
tools | 26.0.1 | Android SDK Tools 26.0.1 | tools/
Available Packages:
Path | Version | Description
------- | ------- | -------
add-ons;addon-g..._apis-google-15 | 3 | Google APIs
add-ons;addon-g..._apis-google-16 | 4 | Google APIs
add-ons;addon-g..._apis-google-17 | 4 | Google APIs
add-ons;addon-g..._apis-google-18 | 4 | Google APIs
add-ons;addon-g..._apis-google-19 | 20 | Google APIs
add-ons;addon-g..._apis-google-21 | 1 | Google APIs
add-ons;addon-g..._apis-google-22 | 1 | Google APIs
add-ons;addon-g..._apis-google-23 | 1 | Google APIs
add-ons;addon-g..._apis-google-24 | 1 | Google APIs
...
¡Hola! ¡Funciona!
- Editar: 2017-11-07 -
Tenga en cuenta que es posible que deba aplicar la solución anterior nuevamente después de ejecutar
sdkmanager --update
, ya que el
sdkmanager
shell
sdkmanager
puede
sdkmanager
si se actualiza el paquete de
tools
.
Respuestas relacionadas
-
https://.com/a/43574427/142239
- @ andy-guibert señaló las opciones necesarias para que esto funcione. También explica brevemente qué significan esas misteriosas opciones.
Las herramientas de Android siguen siendo incompatibles con JDK 9 o 10. Debe instalar JDK 8 o, si necesita varias versiones de Java, asegúrese de que el inicio de Java de todo el sistema apunte a un JDK 8.
Más detalles aquí: ¿Cómo configurar Unity 2017.4 para apuntar a Android y evitar fallas de compilación en OSX?
Me costó encontrar esta solución simplemente agregando el sdkmanager.bat que funciona
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem sdkmanager startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..
@rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0/.."
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no ''java'' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%/lib/sdklib-25.3.1.jar;%APP_HOME%/lib/layoutlib-api-25.3.1.jar;%APP_HOME%/lib/dvlib-25.3.1.jar;%APP_HOME%/lib/repository-25.3.1.jar;%APP_HOME%/lib/gson-2.2.4.jar;%APP_HOME%/lib/commons-compress-1.8.1.jar;%APP_HOME%/lib/httpclient-4.1.1.jar;%APP_HOME%/lib/httpmime-4.1.jar;%APP_HOME%/lib/common-25.3.1.jar;%APP_HOME%/lib/kxml2-2.3.0.jar;%APP_HOME%/lib/annotations-25.3.1.jar;%APP_HOME%/lib/annotations-12.0.jar;%APP_HOME%/lib/jimfs-1.1.jar;%APP_HOME%/lib/httpcore-4.1.jar;%APP_HOME%/lib/commons-logging-1.1.1.jar;%APP_HOME%/lib/commons-codec-1.4.jar;%APP_HOME%/lib/guava-18.0.jar
@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.SdkManagerCli %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable SDKMANAGER_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%SDKMANAGER_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
Para Windows, si nada funciona, intente esto:
-
Abra
sdkmanager.bat
con el Bloc de notas. -
Localice la siguiente línea:
%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%
-
Agregue
--add-modules java.xml.bind
La línea modificada debería verse así:
%JAVA_EXE%" %DEFAULT_JVM_OPTS% --add-modules java.xml.bind %JAVA_OPTS% %SDKMANAGER_OPTS%
Pude resolver el problema mediante el uso de un archivo editado sdkmanager.bat obligando a utilizar el Java incrustado dentro de Android Studio, que supongo que utiliza OpenJDK 8. Aquí está el sdkmanager editado que utilicé:
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem sdkmanager startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..
@rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0/.."
@rem find Java from Android Studio
@rem Find java.exe
if defined ANDROID_STUDIO_JAVA_HOME goto findJavaFromAndroidStudioJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
goto findJavaNormally
:findJavaFromAndroidStudioJavaHome
set JAVA_HOME=%ANDROID_STUDIO_JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
goto findJavaNormally
@rem java from java home
@rem Find java.exe
:findJavaNormally
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
goto javaError
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
goto javaDirectoryError
:javaError
echo.
echo ERROR: JAVA_HOME is not set and no ''java'' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:javaDirectoryError
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%/lib/dvlib-26.0.0-dev.jar;%APP_HOME%/lib/jimfs-1.1.jar;%APP_HOME%/lib/jsr305-1.3.9.jar;%APP_HOME%/lib/repository-26.0.0-dev.jar;%APP_HOME%/lib/j2objc-annotations-1.1.jar;%APP_HOME%/lib/layoutlib-api-26.0.0-dev.jar;%APP_HOME%/lib/gson-2.3.jar;%APP_HOME%/lib/httpcore-4.2.5.jar;%APP_HOME%/lib/commons-logging-1.1.1.jar;%APP_HOME%/lib/commons-compress-1.12.jar;%APP_HOME%/lib/annotations-26.0.0-dev.jar;%APP_HOME%/lib/error_prone_annotations-2.0.18.jar;%APP_HOME%/lib/animal-sniffer-annotations-1.14.jar;%APP_HOME%/lib/httpclient-4.2.6.jar;%APP_HOME%/lib/commons-codec-1.6.jar;%APP_HOME%/lib/common-26.0.0-dev.jar;%APP_HOME%/lib/kxml2-2.3.0.jar;%APP_HOME%/lib/httpmime-4.1.jar;%APP_HOME%/lib/annotations-12.0.jar;%APP_HOME%/lib/sdklib-26.0.0-dev.jar;%APP_HOME%/lib/guava-22.0.jar
@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable SDKMANAGER_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%SDKMANAGER_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
Aquí utilicé una variable ambiental ANDROID_STUDIO_JAVA_HOME que en realidad apunta al JRE integrado en el estudio de Android, por ejemplo: ../android_studio/jre
Esto también tiene un respaldo a JAVA_HOME si ANDROID_STUDIO_JAVA_HOME no está configurado.
Puede configurar las opciones de sdkmanager con SDKMANAGER_OPTS.
Ejemplo:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
https://adoptopenjdk.net actualmente admite todas las distribuciones de JDK desde la versión 8 en adelante. Por ejemplo https://adoptopenjdk.net/releases.html#x64_win
Aquí hay un ejemplo de cómo pude usar JDK versión 8 con sdkmanager y mucho más: https://travis-ci.com/mmcc007/screenshots/builds/109365628
Para JDK 9 (y creo que 10, y posiblemente 11, pero no 12 y más), lo siguiente debería funcionar para que sdkmanager funcione:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list