Nie udało się uruchomić sdkmanager --list z Javą 9

96

Pobrałem i zainstalowałem:

  • JDK ( jdk-9.0.1_osx-x64_bin.dmg) z Oracle tutaj
  • Android SDK ( sdk-tools-darwin-3859397.zip) od Google tutaj .

Po skonfigurowaniu PATHzmiennej spróbowałem uruchomić sdkmanager, co zastąpiło androidpolecenie do zarządzania komponentami SDK. Jednak nie udało się, jak pokazano tutaj:

$ 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

Oto wersja 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)

Czy ktoś wie, jak to naprawić bez wracania do Java 8?

Powiązane pytania

Siu Ching Pong -Asuka Kenji-
źródło
1
Zastanawiam się tylko: jaki jest cel tego zrobienia?
GhostCat
2
Próbuje nowych funkcji w Javie 9, ale jednocześnie tworzy aplikacje na Androida i chce mieć tylko jeden JDK w systemie.
Siu Ching Pong -Asuka Kenji-
Połączona odpowiedź nie dotyczy zestawu SDK systemu Android. Nie wskazywał, który skrypt edytować, a gdzie edytować. Zwróć uwagę, że nie każdy zna skrypt powłoki i pomaga to szybko rozwiązać problem nawet osobom, które je znają. Czy chcesz przeczytać skrypt, który nie został przez Ciebie napisany, aby rozwiązać prosty problem z konfiguracją, podczas gdy działające rozwiązanie jest już przez kogoś przetestowane?
Siu Ching Pong -Asuka Kenji-
2
W związku z tym głosowałem za ponownym otwarciem stackoverflow.com/questions/46402772/ ... nawet tak, jak wskazywały komentarze.
Naman
Nie usuwaj tego, dopóki stackoverflow.com/q/46402772/142239 nie zostanie ponownie otwarty i tam skopiuję moją odpowiedź. Nie mam kopii zapasowej moich postów StackOverflow. Dzięki!
Siu Ching Pong -Asuka Kenji-

Odpowiedzi:

159

Z pomocą tej odpowiedzi pomyślnie rozwiązałem problem.

Zamierzamy zastosować poprawkę w sdkmanager. To jest skrypt powłoki. Znajduje się pod adresem $android_sdk/tools/bin, gdzie $android_sdkrozpakowałeś pakiet Android SDK.

  1. Otwórz sdkmanagerw swoim ulubionym edytorze.
  2. Znajdź wiersz, który ustawia DEFAULT_JVM_OPTSzmienną. W moim egzemplarzu jest to wiersz 31:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
    
  3. Dołączyć następujące opcje do zmiennej: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee. Proszę zwrócić uwagę na cytaty. W mojej kopii linia wygląda następująco:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
    
  4. Zapisz plik i zamknij edytor.
  5. Uruchom polecenie ponownie.

Oto wynik:

$ 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! To działa!

- Edycja: 2017-11-07 -

Należy pamiętać, że po uruchomieniu może być konieczne ponowne zastosowanie powyższej poprawki sdkmanager --update, ponieważ sdkmanagerskrypt powłoki może zostać zastąpiony, jeśli toolspakiet zostanie zaktualizowany.

Powiązane odpowiedzi

Siu Ching Pong -Asuka Kenji-
źródło
1
Jak wspomniano w Przewodniku migracji JDK 9, --add-modules java.se.eenależy traktować jako tymczasowe obejście. Propozycja usunięcia modułu java.xml.bind z Java SE i JDK jest w wersji roboczej tutaj: bugs.openjdk.java.net/browse/JDK-8189188
Alan Bateman
11
Dlaczego nie po prostu wyeksportować JAVA_OPTSzmienną środowiskową export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'zamiast łatać pliki źródłowe zestawu SDK?
Rafa,
7
FWIW, pobrałem i zainstalowałem dziś zarówno JDK, jak i Android SDK Tools w systemie Windows 10 i musiałem ustawić linię tak, set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0.." -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eeaby com.android.sdklib.tool.SdkManagerCliklasa działała poprawnie
RJ Cuthbertson,
2
mając java 11 w systemie, rozwiązanie zaproponowane przez @SherylHohman musi być połączone z tym, java 11 musi być „ukryta” na liście, aby to działało
Alejandro Moya
5
To -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eelub `--add-modules java.xml.bind nie działa z Javą 11 w Mac OS. Jak mogę to naprawić bez instalowania innej wersji Java?
Manish
37

Możesz ustawić opcje sdkmanager za pomocą SDKMANAGER_OPTS.

Przykład:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
bempa
źródło
4
Uwaga: w systemie Windows należy pominąć cytaty:set SDKMANAGER_OPTS=--add-modules java.se.ee
Amfasis
20
java.se.ee już nie istnieje.
Oscar
2
Ta odpowiedź jest nieaktualna, ktoś to naprawi, proszę
Developerium,
25

Zaakceptowana odpowiedź jest nieaktualna w lutym 2019 r. Oto odpowiedź, która będzie działać do czasu sdkmanagermigracji do nowszej wersji Java. Ale do tego czasu nie będziesz już mieć tego problemu.

OpenJDK 10 został superseeded przez OpenJDK 11 , która nie wdrożyć java.se.ee w ogóle . Oznacza to, że hack dodawania--add-modules java.se.ee nic nie robi. Oznacza to również, że OpenJDK 10 zostanie automatycznie usunięty z systemu i zastąpiony przez OpenJDK 11 przy następnej aktualizacji, jeśli aktualizacje są poprawnie skonfigurowane.

Zmodyfikuj, sdkmanageraby używać Java 8, ustawiając JAVA_HOME wewnątrz sdkmanager instalację Java 8. Domyślnie jest to ~/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\.."

W ten sposób możesz nadal używać rozsądnej i utrzymywanej wersji Java w swoim systemie, jednocześnie korzystając z sdkmanager.

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

A teraz mam kilka rurociągów do naprawy.

NatoBoram
źródło
Ta odpowiedź pomogła mi, ponieważ tymczasowo ustawiłem najwyższy punkt JAVA_HOME na instalację Javy z Android Studio: C: \ Program Files \ Android \ Android Studio \ jre
clzola
3
set JAVA_HOME="...\android-studio\current\jre"pomaga mi w systemie Windows 10, podczas gdy wszystkie inne odpowiedzi nie
NearHuscarl
set JAVA_HOME="C:\Program Files\Android\Android Studio\jre"pracował dla mnie w systemie Windows 10. Znajdź ścieżkę do Android Studio. Ustawiłem Javę 11 na moim oryginalnym JAVA_HOME
notes-jj
To nie zadziała: Java 8 nie istnieje już w stabilnej Debianie (półtora roku) i nowszych.
mirabilos
21

W przypadku posiadania języka Java 11 w systemie podane rozwiązania są nieprawidłowe.

To -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or --add-modules java.xml.bind nie działa z Javą 11 w systemie Mac OS.

Z tego powodu musisz obniżyć wersję Java do wersji 8 stąd: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Wyświetl listę zainstalowanych wersji Java

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

Następnie idź do

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

i

./sdkmanager --licenses
thodwris
źródło
1
Zrobiłem to i nadal pojawia się błąd: etc ... Wyjątek w wątku "main" java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema .. Używam Java 12.0.1
james
@jamesemanon może zrestartować, aby zastosować zmiany. Nie mam pojęcia.
thodwris
1
bash: /usr/libexec/java_home: file not foundna mojej instalacji.
Eugene Gr. Philippov
13

W przypadku systemu Windows, jeśli nic nie działa, spróbuj tego:

  • Otwórz za sdkmanager.batpomocą Notatnika.

  • Znajdź następujący wiersz:

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

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

Zmodyfikowana linia powinna wyglądać następująco:

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

Sagar Khatri
źródło
3
Pracował dla mnie w
systemie
11

Aktualizacja 2019-10:

Jak stwierdzono w narzędziu do śledzenia problemów , Google pracuje nad nową wersją narzędzi SDK, która działa na obecnych maszynach JVM (9+)!

Możesz pobrać i używać nowych narzędzi wiersza poleceń Android SDK (1.0.0) w Android Studio lub ręcznie pobierając je z serwerów Google:

Aby uzyskać najnowsze wersje, sprawdź adresy URL w repository.xml .

Jeśli ręcznie rozpakujesz narzędzia wiersza poleceń, zadbaj o umieszczenie ich w podfolderze wewnątrz swojego $ANDROID_HOME(np $ANDROID_HOME/cmdline-tools/....).

G00fY
źródło
1
Narzędzia wiersza poleceń 2.1 (najnowsze) również zawodzą w ten sposób, z Javą 11.
mirabilos
10

Jak czytaliśmy w poprzednich komentarzach, ten błąd występuje, ponieważ aktualna wersja SDK jest niekompatybilna z najnowszymi wersjami Java: 9 i 10.

Aby go rozwiązać, możesz obniżyć wersję Java do Java 8 lub jako obejście możesz wyeksportować następującą opcję na terminalu:

Linux:

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

Okna :

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

To rozwiąże ten błąd dla sdkmanager

I aby go zapisać na stałe można wyeksportować JAVA_OPTS w pliku profilu na platformie Linux ( .zshrc, .bashrcitp) lub dodać jako zmienną środowiskową na stałe w systemie Windows.


ps. To nie działa dla Java 11/11 +, która nie ma modułów Java EE. W przypadku tej opcji dobrym pomysłem jest obniżenie wersji Java lub czekanie na aktualizację Fluttera .

Ref: JDK 11: Koniec drogi dla modułów Java EE

valdeci
źródło
12
Kiedy próbuję, pojawia się kolejny błąd: Wystąpił błąd podczas inicjalizacji warstwy rozruchowej java.lang.module.FindException: Nie znaleziono modułu java.se.ee
Sherin Binu
@SherinBinu, której wersji Java używasz?
valdeci
1
spróbuj użyć --add-modules java.xml.bindzamiast--add-modules java.se.ee
valdeci
@valdeci To faktycznie zadziałało! Dziękuję bardzo!
Apoorv Goyal
8

Jak niektórzy wspominali wcześniej, może to być prostszy problem polegający na tym, że jedna instalacja Java ma pierwszeństwo przed drugą.

W moim przypadku to java 8 została przyćmiona przez domyślną nowszą java.

Zainstalowałem java 8:

sudo apt-get install openjdk-8-jdk

Następnie zaktualizowałem zainstalowaną Javę, aby była nową domyślną:

sudo update-alternatives --config java

Przy czym wybrałem numer identyfikacyjny java 8.

Po wykonaniu tych (dość prostych) kroków mogłem po prostu uruchomić sdkmanager bez błędów.

Mam nadzieję, że to komuś pomoże!

Steve Trotta
źródło
To nie zadziała: Java 8 nie istnieje już w stabilnej Debianie (półtora roku) i nowszych.
mirabilos
5

Trudno było znaleźć to rozwiązanie, po prostu dodając działający plik sdkmanager.bat

@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
victorjpe
źródło
Obawiam się, że nie jest to opłacalna opcja, ponieważ przestanie działać, gdy pojawi się nowa wersja SDK, ponieważ ten fragment kodu zawiera wersje zakodowane na set CLASSPATH=%APP_HOME%\lib\sdklib-25.3.1.jar
stałe
4

Udało mi się rozwiązać ten problem, używając edytowanego pliku sdkmanager.bat, wymuszając użycie języka Java osadzonego w samym Android Studio, które, jak przypuszczam, korzysta z OpenJDK 8. Oto edytowany sdkmanager, którego użyłem:

@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

Tutaj użyłem zmiennej środowiskowej ANDROID_STUDIO_JAVA_HOME, która w rzeczywistości wskazuje na środowisko JRE osadzone w Android Studio, np .: ../android_studio/jre

Ma to również rezerwę do JAVA_HOME, jeśli ANDROID_STUDIO_JAVA_HOME nie jest ustawiona.

Jemsheer KD
źródło
3

Oto, co zrobiłem w Ubuntu 18.04 (każdy Linux zrobi):

$ 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)
Vahid
źródło
To nie zadziała: Java 8 nie istnieje już w stabilnej Debianie (półtora roku) i nowszych.
mirabilos
2

Krótki dodatek do powyższego dla openJDK 11 z narzędziami Android SDK przed aktualizacją do najnowszej wersji.

Powyższe rozwiązania u mnie nie działają

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

Aby to działało, zainstalowałem jaxb-ri (implementację referencyjną) z repozytorium maven.

Informacje zostały podane https://github.com/javaee/jaxb-v2 i linki do https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/2.3.2/jaxb -ri-2.3.2.zip
Ten plik do pobrania zawiera samodzielną implementację środowiska wykonawczego w folderze mod.

Skopiowałem mod-Folder do $ android_sdk \ tools \ lib \ i dodałem do zmiennej classpath:

;% 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;

W końcu wygląda to tak:

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;

Może przegapiłem bibliotekę z powodu pojawienia się drobnych błędów. Ale sdkmanager.bat --update lub --list działa teraz.

OpenGL Beginner
źródło
2

To jest odpowiedź, która sprawi, że to zadziała dla języka Java 11 i nowszych, ponieważ wszystkie interfejsy API JAXB zostały usunięte.

Pobierz Jakarta XML Binding , a konkretnie ten plik zip plik . Potrzebujesz tylko 3 plików w folderze mod, tj. Jakarta.activation.jar, jakarta.xml.bind-api.jar i jakarta.xml.bind-api.jar, a resztę możesz odrzucić.

Przenieś te pliki do folderu APP_HOME / lib. Utworzyłem podfolder jaxb . Tak więc w moim systemie macOS było to: $ HOME / Library / Android / sdk / tools / lib / jaxb

Teraz otwórz sdkmanager za pomocą ulubionego edytora tekstu i pod CLASSPATH = dodaj na początku:

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

Tak więc wyglądało to tak:

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

I to prawie wszystko powinno rozwiązać problem.

Zrobiłem te kroki, ponieważ flutter doctor --android-licensesdawałem mi problemy. I to naprawiło.

Saifur Rahman Mohsin
źródło
1

Jedynym działającym rozwiązaniem dla mnie jest użycie javy dostarczonej ze studiem Android.

ustaw JAVA_HOME na /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

w .bashrc

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

Jeśli używasz fishshella, włóż to~/.config/fish/config.fish

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

(To jest dla Maca, ale jestem pewien, że powinno działać z Linuksem i Windowsem, ustawiając poprawną ścieżkę)

RameshVel
źródło
Może to kolidować z innymi aplikacjami próbującymi używać oryginalnej / innej niż OpenJDK wersji języka Java firmy Oracle. Chociaż OpenJDK jest więcej niż zdolny, niektórzy mogą potrzebować również drugiego.
Jemsheer KD
1

JDK 13.0.1, Android SDK 29, Windows 10

Zasadniczo próbowałem wszystkiego, ale najbardziej efektywnym i jedynym rozwiązaniem, które działało, było przejście na wersję JDK 1.8. Nie wiem dlaczego, jest początek 2020 roku i muszę przejść na roczną wersję jdk z najnowszą wersją fluttera. Może problem występuje w wersji dla systemu Windows, ponieważ jdk 13.0.1 działał dla mnie na macOS 10.15.2. Mam nadzieję, że to rozwiązanie działa.

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

Kedar Sukerkar
źródło
Java 8 została wydana w marcu 2014 r. Więc ma nieco ponad rok ...
pqnet
tak… ale polityka Oracle zmieniła się od czasu Java 8…… nie jest już darmowa dla organizacji. Tak więc wszyscy są zmuszeni do korzystania z Java8
Kedar Sukerkar
Problem polega na tym, że nowsze środowiska wykonawcze java (9+) nie mają bibliotek javax, należy je dostarczyć wraz z aplikacją. Tak więc oprogramowanie, które spodziewa się działać na java 8 i wcześniej, nie dostarcza tych bibliotek, a zatem nie będzie działać na 9+. Powodem, jak się domyślacie, jest uczynienie standardowego JDK w pełni otwartym kodem źródłowym (te biblioteki nie są GPL), więc powiedziałbym, że warunki licencji uległy poprawie.
pqnet
1

Zdefiniuj katalogi domowe różnych wersji JDK w swoim .bashrc lub .zshrc:

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

Przede wszystkim użyj wersji JDK 8. Umieść tę linię na początku sdkmanagerpliku:

export JAVA_HOME=$JAVA_8_HOME

Przełącz się z powrotem do wersji JDK 14. Umieść ten wiersz na dole sdkmanagerpliku:

export JAVA_HOME=$JAVA_14_HOME
Gabor G
źródło
To nie zadziała: Java 8 nie istnieje już w stabilnej Debianie (półtora roku) i nowszych.
mirabilos
1

(WINDOWS)

Jeśli masz już zainstalowane Android Studio, przejdź do File>> Project Structure...>> Lokalizacja SDK.

Przejdź do tej lokalizacji + \cmdline-tools\latest\bin skopiuj ścieżkę doEnvironment Variables

niż jest OK, aby użyć narzędzia wiersza poleceń.

niek tuytel
źródło
0

https://adoptopenjdk.net obsługuje obecnie wszystkie dystrybucje JDK począwszy od wersji 8. Na przykład https://adoptopenjdk.net/releases.html#x64_win

Oto przykład, jak mogłem używać JDK w wersji 8 z sdkmanager i wiele więcej: https://travis-ci.com/mmcc007/screenshots/builds/109365628

W przypadku JDK 9 (i myślę, że 10 i prawdopodobnie 11, ale nie 12 i więcej), następujące czynności powinny działać, aby sdkmanager działał:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
mmccabe
źródło
1
Masz jakiś pomysł, jak to naprawić w SDK 12?
Richie
@Richie Czy rozwiązałeś to, ja też mam Javę 12 i napotykam ten problem i nic, co tutaj zamieszczono, nie pomaga.
James Emanon
1
O ile pamiętam, myślę, że musisz pobrać plik jar zawierający java.se.ee i dodać go do ścieżki (lub coś podobnego). AFAIK Oracle uwolnił słoiki związane z J2EE z JDK na 12 i więcej. Nie testowałem tego za pomocą sdkmanager.
mmccabe
@jamesemanon Nie udało mi się go rozwiązać. Wypróbuj powyższą sugestię
Richie
0

Innym możliwym rozwiązaniem tego błędu jest sprawdzenie wersji Javy, może uda się to rozwiązać pobierając ten jdk oracle-jdk-8 , to był mój błąd: P

Pedro Molina
źródło
0

Pobieram Java 8 SDK

  1. unistall java sdk previuse
  2. zamknij Android Studio
  3. zainstaluj java 8
  4. run-> cmd-> flutter doctor --install -licenses i po
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
ismaelmazrooei
źródło
-2

To bardzo proste, po prostu wyeksportuj JAVA_HOMEzmienną środowiskową, ustaw na ścieżkę swojej instalacji JDK.

Javę zainstalowałem ręcznie na Ubuntu, więc dla mnie wygląda to tak:

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

I upewnij się, że istnieje również na twojej drodze ...

export PATH="$PATH:$JAVA_HOME"
brianarpie
źródło
To nie zadziała: Java 8 nie istnieje już w stabilnej Debianie (półtora roku) i nowszych.
mirabilos