Fehler beim Ausführen von sdkmanager --list mit Java 9


91

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 dem Konfigurieren der PATHVariablen habe ich versucht, sie auszuführen sdkmanager, wodurch der androidBefehl zum Verwalten von SDK-Komponenten ersetzt wurde. Es ist jedoch wie hier gezeigt fehlgeschlagen:

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

Weiß jemand, wie man es behebt, ohne zu Java 8 zurückzukehren?

Verwandte Fragen


1
Ich frage mich nur: Was ist der Zweck davon?
GhostCat

2
Probieren Sie neue Funktionen in Java 9 aus, entwickeln Sie aber gleichzeitig Android-Apps und möchten Sie nur ein JDK im System.
Siu Ching Pong -Asuka Kenji-

Die verknüpfte Antwort ist nicht Android SDK-spezifisch. Es wurde nicht darauf hingewiesen, welches Skript bearbeitet werden soll und wo es bearbeitet werden soll. Bitte beachten Sie, dass nicht jeder das Shell-Skript kennt und es hilft, das Problem schnell zu lösen, selbst für Leute, die es wissen. Möchten Sie ein Skript lesen, das nicht von Ihnen geschrieben wurde, um ein einfaches Konfigurationsproblem zu lösen, während eine funktionierende Lösung bereits von jemandem getestet wurde?
Siu Ching Pong -Asuka Kenji-

2
In diesem Sinne habe ich dafür gestimmt, stackoverflow.com/questions/46402772/… wieder zu öffnen, auch wenn in den Kommentaren darauf hingewiesen wurde.
Naman

Bitte löschen Sie dies erst, wenn stackoverflow.com/q/46402772/142239 erneut geöffnet wird und ich meine Antwort dort kopiere. Ich habe kein Backup meiner StackOverflow-Beiträge. Vielen Dank!
Siu Ching Pong -Asuka Kenji-

Antworten:


158

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

Wir werden einen Fix in anwenden sdkmanager. Es ist ein Shell-Skript. Es befindet sich $android_sdk/tools/bindort, $android_sdkwo Sie das Android SDK entpackt haben.

  1. Öffnen Sie sdkmanagerin Ihrem Lieblingseditor.
  2. Suchen Sie die Zeile, in der die DEFAULT_JVM_OPTSVariable festgelegt ist. In meiner Kopie steht es 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:

    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!

- Bearbeiten: 2017-11-07 -

Bitte beachten Sie, dass Sie den obigen Fix nach dem Ausführen möglicherweise erneut anwenden müssen sdkmanager --update, da das sdkmanagerShell-Skript möglicherweise überschrieben wird, wenn das toolsPaket aktualisiert wird.

Verwandte Antworten


1
Wie im JDK 9-Migrationshandbuch angegeben, --add-modules java.se.eesollte dies als vorübergehende Problemumgehung angesehen werden. Der Vorschlag, das Modul java.xml.bind aus Java SE und dem JDK zu löschen,
Alan Bateman

11
Warum nicht einfach die JAVA_OPTSUmgebungsvariable exportieren export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee', anstatt die SDK-Quelldateien zu patchen?
Rafa

6
FWIW, ich habe heute sowohl das JDK- als auch das Android SDK-Tool unter Windows 10 heruntergeladen und installiert und musste die Zeile so einstellen set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0.." -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee, dass die com.android.sdklib.tool.SdkManagerCliKlasse ordnungsgemäß ausgeführt wird
RJ Cuthbertson

1
Obwohl ich mich für diese Lösung entschieden habe (die für mich einfacher zu verfolgen ist), gibt es hier eine alternative "Lösung" . Eine langfristige Lösung wäre wunderbar.
SherylHohman

4
Dieses -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eeoder `--add-modules java.xml.bind funktioniert nicht mit Java 11 unter Mac OS. Wie kann ich das Problem beheben, ohne eine andere Java-Version zu installieren?
Manish

37

Sie können sdkmanager-Optionen mit SDKMANAGER_OPTS festlegen.

Beispiel:

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

4
Bitte beachten Sie unter Windows, dass Sie die Anführungszeichen weglassen sollten:set SDKMANAGER_OPTS=--add-modules java.se.ee
Amfasis

18
java.se.ee existiert nicht mehr.
Oscar

2
Diese Antwort ist veraltet, jemand repariert dies bitte
Developerium

19

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

10 OpenJDK wurde superseeded von OpenJDK 11 , die es nicht implementieren java.se.ee überhaupt . Dies bedeutet, dass der Hack des Hinzufügens --add-modules java.se.eenichts mehr tut. 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 sdkmanagerverwenden Java 8 , indem JAVA_HOME innerhalb sdkmanager zu einer Java - 8 - Installation. Es ist standardmäßig um ~/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 gepflegte Version von Java auf Ihrem System verwenden und gleichzeitig verwenden sdkmanager.

# Java
export JAVA_HOME=/usr/lib/jvm/default-java

Und jetzt muss ich einige Pipelines reparieren.


Diese Antwort hat mir geholfen, als ich JAVA_HOME vorübergehend als obersten Punkt für die Java-Installation von Android Studio festgelegt habe: C: \ Programme \ Android \ Android Studio \ jre
clzola

2
set JAVA_HOME="...\android-studio\current\jre"hilft mir unter Windows 10, während alle anderen Antworten dies nicht taten
NearHuscarl

set JAVA_HOME="C:\Program Files\Android\Android Studio\jre"arbeitete für mich unter Windows 10. Finden Sie Ihren Android Studio-Pfad heraus. Ich habe Java 11 auf meinem ursprünglichen JAVA_HOME eingestellt
notes-jj

Dies funktionierte auch für mich auf Debian 10
Martin Naughton

18

Wenn Sie Java 11 im System haben, sind die bereitgestellten Lösungen nicht gültig.

Dies -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or --add-modules java.xml.bind funktionieren 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

Liste der installierten Java-Versionen

/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

1
Ich habe dies getan und bekomme immer noch den Fehler: etc ... Ausnahme im Thread "main" java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema .. Ich verwende Java 12.0.1
james emanon

@jamesemanon führt möglicherweise einen Neustart durch, um die Änderungen zu übernehmen. Ich habe keine Ahnung.
Thodwris

bash: /usr/libexec/java_home: file not foundbei meiner Installation.
Eugene Gr. Philippov

13

Wenn unter Windows nichts funktioniert, versuchen Sie Folgendes:

  • sdkmanager.batMit Editor öffnen .

  • Suchen Sie die folgende Zeile:

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

  • Hinzufügen --add-modules java.xml.bind

Die geänderte Zeile sollte folgendermaßen aussehen:

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


3
Arbeitete für mich unter Windows 10.
AntonB

10

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

Um dieses Problem zu lösen, können Sie Ihre Java-Version auf Java 8 herunterstufen oder als Problemumgehung 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'

Dies wird diesen Fehler für die lösen sdkmanager

Und damit es dauerhaft gespeichert können Sie die JAVA_OPTS in Ihrer Profildatei auf Linux exportieren ( .zshrc, .bashrcusw.) oder als Umgebungsvariable hinzufügen permanent unter Windows.


ps. Dies funktioniert nicht für Java 11+, das keine Java EE-Module enthält. Für diese Option ist es eine gute Idee, Ihre Java-Version herunterzustufen oder auf ein Flattern zu warten Update zu .

Ref: JDK 11: Ende der Straße für Java EE-Module


11
Wenn ich dies versuche, erhalte ich einen weiteren Fehler: Fehler beim Initialisieren der Boot-Schicht java.lang.module.FindException: Modul java.se.ee 'nicht gefunden
Sherin Binu

@SherinBinu Welche Java-Version verwenden Sie?
Valdeci

1
versuchen Sie --add-modules java.xml.bindanstelle von--add-modules java.se.ee
valdeci

@valdeci Das hat tatsächlich funktioniert! Ich danke dir sehr!
Apoorv Goyal

9

Update 2019-10:

Wie im Issue-Tracker angegeben , hat Google an einer neuen Version der SDK-Tools gearbeitet, die auf aktuellen JVMs (9+) ausgeführt wird!

Sie können die neuen Android SDK-Befehlszeilentools (1.0.0) in Android Studio herunterladen und verwenden oder sie manuell von den Google-Servern herunterladen:

Überprüfen Sie für die neuesten Versionen die URLs in der Datei repository.xml .

Wenn Sie die Befehlszeilentools manuell entpacken, müssen Sie sie in einem Unterordner in Ihrem $ANDROID_HOME(z $ANDROID_HOME/cmdline-tools/.... B. ) ablegen .


8

Wie einige Leute bereits erwähnt haben, könnte dies ein einfacheres Problem sein, da eine Java-Installation Vorrang vor der anderen hat.

In meinem Fall wurde Java 8 von einem neueren Standard-Java überschattet.

Ich habe Java 8 installiert:

sudo apt-get install openjdk-8-jdk

Dann habe ich das installierte Java auf den neuen Standard aktualisiert:

sudo update-alternatives --config java

Wobei ich die ID-Nummer von Java 8 ausgewählt habe.

Nachdem ich diese (ziemlich einfachen) Schritte ausgeführt hatte, konnte ich sdkmanager einfach ohne Fehler ausführen.

Hoffe das hilft jemandem!



5

Es fiel mir schwer, diese Lösung herauszufinden, indem ich nur die funktionierende Datei 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

Ich fürchte, es ist keine praktikable Option, da dies nicht mehr funktioniert, wenn eine neue Version des SDK herauskommt, da dieses Code-Snippet fest codierte Versionen enthält:set CLASSPATH=%APP_HOME%\lib\sdklib-25.3.1.jar
izogfif

4

Ich konnte das Problem mithilfe einer bearbeiteten sdkmanager.bat-Datei lösen, indem ich die Verwendung des in Android Studio selbst eingebetteten Java erzwang, das vermutlich OpenJDK 8 verwendet. Hier ist der bearbeitete sdkmanager, den ich verwendet 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 gesetzt ist.


2

Das habe ich in Ubuntu 18.04 gemacht (jedes Linux wird es tun):

$ sudo apt-get install openjdk-8-jdk

$ sudo update-alternatives --config java
There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                          Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac    1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: 2

$ export JAVA_HOME=$(/usr/lib/jvm/java-1.8.0-openjdk-amd64)

1

Kurze Ergänzung zu den oben genannten für openJDK 11 mit Android SDK-Tools vor dem Upgrade auf die neueste Version.

Die oben genannten Lösungen haben bei mir nicht funktioniert

set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."

Um dies zum Laufen zu bringen, habe ich das jaxb-ri (Referenzimplementierung) aus dem Maven Repo installiert.

Die Informationen wurden unter https://github.com/javaee/jaxb-v2 und Links zu https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/2.3.2/jaxb bereitgestellt -ri-2.3.2.zip
Dieser Download enthält eine eigenständige Laufzeitimplementierung im Mod-Ordner.

Ich habe den Mod-Ordner nach $ android_sdk \ tools \ lib \ kopiert und der Klassenpfadvariablen Folgendes hinzugefügt:

;% APP_HOME% \ lib \ mod \ jakarta.xml.bind-api.jar;% APP_HOME% \ lib \ mod \ jakarta.activation-api.jar;% APP_HOME% \ lib \ mod \ jaxb-runtime.jar;% APP_HOME% \ lib \ mod \ istack-commons-runtime.jar;

So sieht es endlich aus:

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;%APP_HOME%\lib\mod\jakarta.xml.bind-api.jar;%APP_HOME%\lib\mod\jakarta.activation-api.jar;%APP_HOME%\lib\mod\jaxb-runtime.jar;%APP_HOME%\lib\mod\istack-commons-runtime.jar;

Vielleicht habe ich eine Bibliothek verpasst, weil kleinere Fehler aufgetreten sind. Aber sdkmanager.bat --update oder --list läuft jetzt.


1

Die einzige funktionierende Lösung für mich ist die Verwendung des mit dem Android Studio gelieferten Java.

Setzen Sie JAVA_HOME auf /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

im .bashrc

set JAVA_HOME="/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home"

Wenn Sie fishShel verwenden, geben Sie dies ein~/.config/fish/config.fish

set -gx JAVA_HOME /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

(Dies ist für Mac, aber ich bin sicher, dass es mit Linux und Windows funktionieren sollte, indem der richtige Pfad festgelegt wird.)


Dies kann andere Anwendungen beeinträchtigen, die versuchen, die Original- / Nicht-OpenJDK-Version von Java von Oracle zu verwenden. Obwohl OpenJDK mehr als fähig ist, benötigen einige möglicherweise auch das andere.
Jemsheer KD

1

JDK 13.0.1, Android SDK 29, Windows 10

Grundsätzlich habe ich alles versucht, aber die effektivste und einzige Lösung, die für mich funktioniert hat, war das Downgrade auf JDK 1.8. Ich weiß nicht warum, es ist Anfang 2020 und ich muss auf die 1 Jahr alte JDK-Version gegen die neueste Flatterversion herunterstufen. Möglicherweise liegt das Problem in der Windows-Version, da JDK 13.0.1 unter MacOS 10.15.2 für mich funktioniert hat. Hoffe, diese Lösung funktioniert.

Download-Link (JDK 1.8.0): https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


Java 8 wurde im März 2014 veröffentlicht. Es ist also etwas älter als 1 Jahr ...
pqnet

Ja, aber die Oracle-Richtlinie hat sich seit Java 8 geändert. Sie ist für die Organisation nicht mehr kostenlos. Daher sind alle gezwungen, Java8
Kedar Sukerkar

Das Problem ist, dass neuere Java-Laufzeiten (9+) keine Javax-Bibliotheken haben. Sie sollten diese mit Ihrer Anwendung ausliefern. Daher wird Software, die voraussichtlich unter Java 8 und früher ausgeführt wird, nicht ausgeliefert und funktioniert daher nicht mit 9+. Der Grund ist, wie Sie vermutet haben, dass das Standard-JDK vollständig Open Source ist (diese Bibliotheken sind keine GPL), daher würde ich sagen, dass sich die Lizenzbedingungen verbessert haben.
pqnet

1

Definieren Sie Home-Verzeichnisse verschiedener JDK-Versionen in Ihrem .bashrc oder .zshrc:

export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)

Verwenden Sie zunächst JDK Version 8. Setzen Sie diese Zeile oben in die sdkmanagerDatei:

export JAVA_HOME=$JAVA_8_HOME

Wechseln Sie zurück zu JDK Version 14. Fügen Sie diese Zeile am Ende der sdkmanagerDatei ein:

export JAVA_HOME=$JAVA_14_HOME

1

Dies ist die Antwort, damit dies für Java 11 und höher funktioniert, da die gesamten JAXB-APIs entfernt wurden.

Laden Sie Jakarta XML Binding herunter , speziell diese Zip Datei. Sie benötigen nur die 3 Dateien im Mod-Ordner, dh jakarta.activation.jar, jakarta.xml.bind-api.jar und jakarta.xml.bind-api.jar, und Sie können den Rest wegwerfen.

Verschieben Sie diese Dateien in den Ordner APP_HOME / lib. Ich habe einen Unterordner jaxb erstellt . Auf meinem MacOS-System war dies also: $ HOME / Library / Android / sdk / tools / lib / jaxb

Öffnen Sie nun sdkmanager mit Ihrem bevorzugten Texteditor und fügen Sie unter CLASSPATH = am Anfang Folgendes hinzu:

$APP_HOME/lib/jaxb/jakarta.activation.jar:$APP_HOME/lib/jaxb/jakarta.xml.bind-api.jar:$APP_HOME/lib/jaxb/jaxb-impl.jar

So sah es aus wie:

CLASSPATH=$APP_HOME/lib/jaxb/jakarta.activation.jar:$APP_HOME/lib/jaxb/jakarta.xml.bind-api.jar:$APP_HOME/lib/jaxb/jaxb-impl.jar:$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

Und das ist so ziemlich alles, sollte das Problem lösen.

Ich habe diese Schritte gemacht, weil flutter doctor --android-licensesich Probleme hatte. Und das hat es behoben.


0

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, damit sdkmanager funktioniert:

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

1
Haben Sie eine Idee, wie Sie dies für SDK 12 beheben können?
Richie

@Richie Hast du das gelöst, ich habe auch Java 12 und bin auf dieses Problem gestoßen, und nichts, was hier gepostet wird, hilft.
James Emanon

1
Soweit ich mich erinnere, müssen Sie die JAR-Datei, die java.se.ee enthält, herunterladen und dem Pfad (oder ähnlichem) hinzufügen. AFAIK Oracle entbündelte J2EE-bezogene Gläser für 12 und mehr vom JDK. Habe dies nicht mit sdkmanager getestet.
mmccabe

@ Jamesemanon Ich habe es nicht geschafft, es zu lösen. Versuchen Sie den obigen Vorschlag
Richie

0

Eine andere mögliche Lösung für diesen Fehler ist das Überprüfen Ihrer Java-Version. Vielleicht können Sie sie lösen, indem Sie dieses JDK- Orakel-JDK-8 herunterladen. Dies war mein Fehler: P.



0

Es ist sehr einfach, exportieren Sie einfach die JAVA_HOMEUmgebungsvariable, die auf den Pfad Ihrer JDK-Installation festgelegt ist.

Ich habe Java manuell unter Ubuntu installiert und für mich sieht das so aus:

export JAVA_HOME="$HOME/pkg-src/jdk1.8.0_251"

Und stellen Sie sicher, dass es auch auf Ihrem Weg existiert ...

export PATH="$PATH:$JAVA_HOME"

0

Ich lade Java 8 SDK herunter

  1. unistall java sdk previuse
  2. Android Studio schließen
  3. Java 8 installieren
  4. run-> cmd-> flutter doctor --install -licenses und danach
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.12.13+hotfix.9, on Microsoft Windows [Version 10.0.19041.388], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[√] Android Studio (version 4.0)
[√] VS Code (version 1.47.3)
[!] Connected device
    ! No devices available

! Doctor found issues in 1 category
display  and finish
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.