Ich habe heruntergeladen und installiert:
jdk-9.0.1_osx-x64_bin.dmg
) von Oracle hiersdk-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?
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.
sdkmanager
in Ihrem bevorzugten Editor.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"'
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'
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!
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.
Sie können sdkmanager-Optionen mit SDKMANAGER_OPTS festlegen.
Beispiel:
export SDKMANAGER_OPTS="--add-modules Java.se.ee"
sdkmanager --list
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%
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.
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
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?
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.
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
/usr/libexec/Java_home -V
export Java_HOME=$(/usr/libexec/Java_home -v 11)
export Java_HOME=$(/usr/libexec/Java_home -v 1.8)
Dann geh zu
cd ~/Library/Android/sdk/tools/bin
und
./sdkmanager --licenses
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 SieJava_HOME
innerhalbsdkmanager
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.
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