not - Falha ao executar o sdkmanager--list(Android SDK) com o Java 9



java lang noclassdeffounderror android sdk (6)

Ao ter o java 11 no sistema, as soluções fornecidas não são válidas.

Este -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or -modules java.xml.bind não funcionam com o Java 11 no Mac OS.

Por esse motivo você tem que fazer o downgrade da versão java para a versão 8 a partir daqui: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Listar versões do 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)

Então vá para

cd ~/Library/Android/sdk/tools/bin

e

./sdkmanager --licenses

Eu baixei e instalei:

  • JDK ( jdk-9.0.1_osx-x64_bin.dmg ) da Oracle here
  • Android SDK ( sdk-tools-darwin-3859397.zip ) do Google here .

Depois de configurar a variável PATH , tentei executar o sdkmanager , que substituiu o comando android para gerenciar os componentes do SDK. No entanto, falhou como mostrado aqui:

$ 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

Aqui está a versão do 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)

Alguém sabe como consertá-lo sem voltar ao Java 8?

Perguntas relacionadas

  • Falha ao instalar o android-sdk
    • Este post fez uma pergunta semelhante. No entanto, o post é fechado e a única resposta sugere voltar ao Java 8.


Conforme lemos nos comentários anteriores, esse erro está ocorrendo porque a versão atual do SDK é incompatível com as versões mais recentes do Java: 9 e 10.

Então, para resolvê-lo, você pode fazer o downgrade da sua versão do Java para o Java 8 ou, como solução alternativa, exportar a seguinte opção no seu terminal:

Linux:

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

Windows :

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

Isso resolverá esse erro para o sdkmanager

E para que seja salvo permanentemente, você pode exportar o JAVA_OPTS no seu arquivo de perfil no linux ( .zshrc , .bashrc e etc.) ou adicionar como variável de ambiente permanentemente no Windows.

ps. Isso não funciona para o Java 11+, que não possui módulos Java EE. Para essa opção é uma boa ideia, faça downgrade de sua versão do Java ou aguarde uma update Flutter.

Ref: JDK 11: Fim da estrada para módulos Java EE


Consegui resolver o problema usando um arquivo sdkmanager.bat editado, forçando o uso do Java embutido no próprio Android Studio, que presumo que use o OpenJDK 8. Aqui está o sdkmanager editado que eu usei:

@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

Aqui eu usei uma variável ambiental ANDROID_STUDIO_JAVA_HOME que realmente aponta para o JRE embutido no estúdio android, por exemplo: ../android_studio/jre

Isso também tem um fallback para JAVA_HOME se ANDROID_STUDIO_JAVA_HOME não estiver configurado.


Para o Windows, se nada funcionar, tente isto:

  • Abra o sdkmanager.bat com o Bloco de Notas.

  • Localize a seguinte linha:

    %JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%

  • Adicione --add-modules java.xml.bind

A linha modificada deve ficar assim:

%JAVA_EXE%" %DEFAULT_JVM_OPTS% --add-modules java.xml.bind %JAVA_OPTS% %SDKMANAGER_OPTS%


Você pode definir opções do sdkmanager com SDKMANAGER_OPTS.

Exemplo:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list




android-sdk-manager