wake-up-neo.com

Fehler beim Ausführen von sdkmanager --list (Android SDK) mit Java 9

Ich habe heruntergeladen und installiert:

  • JDK (jdk-9.0.1_osx-x64_bin.dmg) von Oracle hier
  • Android SDK (sdk-tools-darwin-3859397.Zip) von Google hier .

Nach der Konfiguration der Variablen PATH habe ich versucht, sdkmanager auszuführen, wodurch der Befehl Android zum Verwalten von SDK-Komponenten ersetzt wurde. Es ist jedoch fehlgeschlagen, wie hier gezeigt:

$ 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

Hier ist die Java-Version:

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

Kann jemand das Problem beheben, ohne wieder auf Java 8 zurückzugreifen?

Verwandte Fragen

Mit Hilfe von dieser Antwort habe ich das Problem erfolgreich gelöst.

Wir werden eine Korrektur in sdkmanager anwenden. Es ist ein Shell-Skript. Es befindet sich unter $Android_sdk/tools/bin, wo Sie $Android_sdk das Android-SDK entpackt haben. 

  1. Öffnen Sie sdkmanager in Ihrem bevorzugten Editor.
  2. Suchen Sie die Zeile, in der die Variable DEFAULT_JVM_OPTS festgelegt ist. In meiner Kopie steht in Zeile 31:

    DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME"'
    
  3. Fügen Sie der Variablen die folgenden Optionen hinzu: -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee. Bitte beachten Sie die Zitate. In meiner Kopie wird die Zeile zu:

    DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
    
  4. Speichern Sie die Datei und beenden Sie den Editor.
  5. Führen Sie den Befehl erneut aus.

Hier ist das Ergebnis:

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

Hallo! Es klappt!

- Editieren: 2017-11-07 -

Beachten Sie, dass Sie das obige Update möglicherweise nach dem Ausführen von sdkmanager --update erneut anwenden müssen, da das sdkmanager Shell-Skript überschrieben werden kann, wenn das tools-Paket aktualisiert wird.

Verwandte Antworten

Sie können sdkmanager-Optionen mit SDKMANAGER_OPTS festlegen.

Beispiel:

export SDKMANAGER_OPTS="--add-modules Java.se.ee"
sdkmanager --list
24
bempa

Wenn nichts funktioniert, versuchen Sie es unter Windows:

  • Öffnen Sie sdkmanager.bat mit dem Editor.

  • Suchen Sie die folgende Zeile:

    %Java_EXE%" %DEFAULT_JVM_OPTS% %Java_OPTS% %SDKMANAGER_OPTS%

  • --add-modules Java.xml.bind hinzufügen

Die modifizierte Zeile sollte folgendermaßen aussehen:

%Java_EXE%" %DEFAULT_JVM_OPTS% --add-modules Java.xml.bind %Java_OPTS% %SDKMANAGER_OPTS%

6
Sagar Khatri

Wie wir in den vorherigen Kommentaren gelesen haben, tritt dieser Fehler auf, weil die aktuelle SDK-Version mit den neuesten Java-Versionen nicht kompatibel ist: 9 und 10.

Um dieses Problem zu lösen, können Sie Ihre Java-Version auf Java 8 herunterstufen oder als Umgehungslösung die folgende Option auf Ihr Terminal exportieren:

Linux:

export Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'

Windows :

set Java_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'

Dadurch wird dieser Fehler für sdkmanager behoben.

Um es dauerhaft zu speichern, können Sie Java_OPTS in Ihrer Profildatei unter Linux exportieren (.zshrc, .bashrc usw.) oder unter Windows dauerhaft als Umgebungsvariable hinzufügen.

5
coderade

Es fiel mir schwer, diese Lösung herauszufinden, indem ich nur die funktionierende sdkmanager.bat hinzufügte

@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
5
victorjpe

Die Android Tools sind immer noch nicht mit JDK 9 oder 10 kompatibel. Sie müssen JDK 8 installieren. Wenn Sie mehrere Java-Versionen benötigen, stellen Sie sicher, dass die systemweite Java-Startseite auf ein JDK 8 verweist.

Weitere Informationen finden Sie hier: Wie kann Unity 2017.4 so konfiguriert werden, dass Android als Ziel verwendet wird und Build-Fehler unter OSX vermieden werden?

3
German

Ich konnte das Problem mit einer bearbeiteten Datei sdkmanager.bat lösen, indem ich die Verwendung des Java erzwungen habe, das im Android Studio selbst eingebettet ist der bearbeitete sdkmanager den ich benutzt habe:

@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

Hier habe ich eine Umgebungsvariable Android_STUDIO_Java_HOME verwendet, die tatsächlich auf die im Android -Studio eingebettete JRE verweist, z. B .: ../Android_studio/jre

Dies hat auch einen Fallback auf Java_HOME, wenn Android_STUDIO_Java_HOME nicht festgelegt ist.

3
Jemsheer K D

Wenn Java 11 im System installiert ist, sind die angebotenen Lösungen nicht gültig.

Dieser -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee or-- add-modules Java.xml.bind funktioniert nicht mit Java 11 unter Mac OS. 

Aus diesem Grund müssen Sie die Java-Version von hier auf Version 8 herunterstufen: http://www.Oracle.com/technetwork/Java/javase/downloads/jdk8-downloads-2133151.html

Listet die installierten Java-Versionen auf

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

Dann geh zu 

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

und

./sdkmanager --licenses
0
thodwris

Die akzeptierte Antwort ist seit Februar 2019 veraltet. Hier ist eine Antwort Dies funktioniert, bis sdkmanager auf eine neuere Version von Java migriert wird. Aber bis dahin werden Sie dieses Problem nicht mehr haben.

OpenJDK 10 wurde von OpenJDK 11 abgelöst , das Java.se.ee überhaupt nicht implementiert . Dies bedeutet, dass der Hack des Hinzufügens von --add-modules Java.se.ee nichts mehr bewirkt. Dies bedeutet auch, dass OpenJDK 10 automatisch von Ihrem System entfernt und beim nächsten Update durch OpenJDK 11 ersetzt wird, wenn Ihre Updates ordnungsgemäß konfiguriert sind.

Ändern Sie sdkmanager, um Java 8 zu verwenden, indem Sie Java_HOME innerhalb sdkmanager auf _ setzen. Installation vonJava 8. Es ist standardmäßig bei ~/Android/Sdk/tools/bin/sdkmanager.

# Add default JVM options here. You can also use Java_OPTS and SDKMANAGER_OPTS to pass JVM options $
Java_HOME=/usr/lib/jvm/Java-1.8.0-openjdk-AMD64
DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions'
@rem Add default JVM options here. You can also use Java_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set Java_HOME="C:\ProgramData\scoop\apps\Android-studio\current\jre"
set DEFAULT_JVM_OPTS="-Dcom.Android.sdklib.toolsdir=%~dp0\.."

Auf diese Weise können Sie weiterhin eine vernünftige und gewartete Version von Java auf Ihrem System verwenden, während Sie gleichzeitig sdkmanager verwenden.

# Java
export Java_HOME=/usr/lib/jvm/default-Java

Und jetzt muss ich einige Pipelines reparieren.

0
NatoBoram

https://adoptopenjdk.net unterstützt derzeit alle Distributionen von JDK ab Version 8. Zum Beispiel https://adoptopenjdk.net/releases.html#x64_win

Hier ist ein Beispiel, wie ich JDK Version 8 mit sdkmanager und vielem mehr verwenden konnte: https://travis-ci.com/mmcc007/screenshots/builds/109365628

Für JDK 9 (und ich denke 10 und möglicherweise 11, aber nicht 12 und darüber hinaus) sollte Folgendes funktionieren, um sdkmanager zum Laufen zu bringen:

export SDKMANAGER_OPTS="--add-modules Java.se.ee"
sdkmanager --list
0
mmccabe