Не удалось запустить sdkmanager --list (Android SDK) с Java 9
Я скачал и установил:
- JDK (
jdk-9.0.1_osx-x64_bin.dmg
) от Oracle здесь - Android SDK (
sdk-tools-darwin-3859397.zip
) от гугл тут.
После настройки PATH
переменная, я пытался запустить sdkmanager
, который заменил android
команда для управления компонентами SDK. Однако, это не удалось, как показано здесь:
$ 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
Вот версия 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)
Кто-нибудь знает, как это исправить, не возвращаясь к Java 8?
Смежные вопросы
- Не удалось установить Android-SDK
- Этот пост задал похожий вопрос. Тем не менее, пост закрыт, и единственный ответ предлагает вернуться к Java 8.
32 ответа
С помощью этого ответа я успешно решил проблему.
Мы собираемся применить исправление в sdkmanager
, Это сценарий оболочки. Он расположен по адресу $android_sdk/tools/bin
, где $android_sdk
где вы разархивировали Android SDK.
- открыто
sdkmanager
в вашем любимом редакторе. Найдите строку, которая устанавливает
DEFAULT_JVM_OPTS
переменная. В моей копии это в строке 31:DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
Добавьте следующие переменные к переменной:
-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
, Пожалуйста, обратите внимание на цитаты. В моем экземпляре строка становится:DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
- Сохраните файл и выйдите из редактора.
- Запустите команду еще раз.
Вот результат:
$ 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! Оно работает!
- Изменить: 2017-11-07 -
Обратите внимание, что вам может понадобиться применить исправление выше после запуска sdkmanager --update
, так как sdkmanager
сценарий оболочки может быть переопределен, если tools
Пакет обновлен.
Похожие ответы
- /questions/42612362/kak-reshit-javalangnoclassdeffounderror-javaxxmlbindjaxbexception-v-java-9/42612381#42612381
- @ andy-guibert указал необходимые параметры, чтобы сделать эту работу. Он также кратко рассказал, что означают эти загадочные варианты.
Принятый ответ устарел по состоянию на февраль 2019 года. Вот ответ, который будет работать до sdkmanager
мигрирует на более новую версию Java. Но к тому времени у вас больше не будет этой проблемы.
OpenJDK 10 был заменен OpenJDK 11, который не реализует
java.se.ee
на всех. Это означает, что взломать добавление--add-modules java.se.ee
больше ничего не делает Это также означает, что OpenJDK 10 будет автоматически удален из вашей системы и заменен OpenJDK 11 при следующем обновлении, если ваши обновления настроены правильно.изменять
sdkmanager
использовать Java 8, установивJAVA_HOME
внутриsdkmanager
к установке Java 8. По умолчанию~/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\.."
Таким образом, вы можете продолжать использовать разумную и поддерживаемую версию Java в вашей системе, одновременно используя
sdkmanager
,# Java export JAVA_HOME=/usr/lib/jvm/default-java
И теперь у меня есть несколько трубопроводов для ремонта.
Вы можете установить параметры sdkmanager с помощью SDKMANAGER_OPTS.
Пример:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
Установите инструменты командной строки в диспетчере SDK через Android Studio.
Затем запустите версию SDK Manager из
cmdline-tools
каталог, в отличие от
tools
каталог .
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --version # GOOD!
$ANDROID_HOME/tools/bin/sdkmanager --version # BAD! (java.lang.NoClassDefFoundError)
При наличии java 11 в системе предоставленные решения недействительны.
это -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or
--add-modules java.xml.bind не работают с Java 11 в Mac OS.
По этой причине вы должны понизить версию Java до версии 8 отсюда: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Список установленных версий 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)
Затем перейдите к
cd ~/Library/Android/sdk/tools/bin
а также
./sdkmanager --licenses
Обновление 2019-10:
Как указано в системе отслеживания проблем, Google работает над новым выпуском инструментов SDK, который работает на текущих JVM (9+)!
Вы можете загрузить и использовать новые инструменты командной строки Android SDK (1.0.0) внутри Android Studio или вручную загрузив их с серверов Google:
Для последних версий проверьте URL-адреса в repository.xml.
Если вы вручную распаковываете инструменты командной строки, позаботьтесь о том, чтобы поместить их во вложенную папку внутри вашего $ANDROID_HOME
(например $ANDROID_HOME/cmdline-tools/...
).
Я просто добавил «Инструменты командной строки Android SDK (последняя версия)», и это решило мою проблему.
Исходно отсюда:https://github.com/flutter/flutter/issues/56778#issuecomment-742639036
Для Windows, если ничего не работает, чем попробуйте это
Откройте sdkmanager.bat с помощью блокнота. Найдите следующую строку:
% JAVA_EXE% "% DEFAULT_JVM_OPTS%% JAVA_OPTS%% SDKMANAGER_OPTS% тогда и
добавить "--add-modules java.xml.bind"
Это должно выглядеть так:%JAVA_EXE%" %DEFAULT_JVM_OPTS% --add-modules java.xml.bind %JAVA_OPTS% %SDKMANAGER_OPTS%
Как мы читали в предыдущих комментариях, эта ошибка происходит, потому что текущая версия SDK несовместима с новейшими версиями Java: 9 и 10.
Таким образом, чтобы решить эту проблему, вы можете понизить версию Java до Java 8, или, в качестве обходного пути, вы можете экспортировать следующую опцию на свой терминал:
Linux:
export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Windows:
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Это решит эту ошибку для sdkmanager
И чтобы сохранить его навсегда, вы можете экспортировать JAVA_OPTS в вашем профиле в Linux (.zshrc
, .bashrc
и т. д.) или добавить в качестве переменной среды навсегда в Windows.
Как некоторые люди упоминали ранее, это может быть более простой проблемой, связанной с тем, что одна установка java имеет приоритет над другой.
В моем случае это была java 8, которая затмевала более новую java по умолчанию.
Я установил java 8:
sudo apt-get install openjdk-8-jdk
Затем я обновил установленную java, чтобы она стала новой по умолчанию:
sudo update-alternatives --config java
При этом я выбрал идентификационный номер java 8.
После выполнения этих (довольно простых) шагов я мог просто запустить sdkmanager без ошибок.
Надеюсь, это кому-то поможет!
Инструменты Android по-прежнему несовместимы с JDK 9 или 10. Вам необходимо установить JDK 8 или, если вам нужно несколько версий Java, убедиться, что системная домашняя страница Java указывает на JDK 8.
Подробнее здесь: Как настроить Unity 2017.4 для работы с Android и избежать сбоев сборки на OSX?
Мне было сложно разобраться в этом решении, просто добавив работающий 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
Вот что я сделал в Ubuntu 18.04 (подойдет любой Linux):
$ 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)
Я смог решить эту проблему, используя отредактированный файл sdkmanager.bat, заставив использовать Java, встроенный в Android Studio, который, как я полагаю, использует OpenJDK 8. Вот отредактированный sdkmanager, который я использовал:
@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
Здесь я использовал переменную среды ANDROID_STUDIO_JAVA_HOME, которая фактически указывает на JRE, встроенную в андроид студию, например: ../android_studio/jre
Это также имеет откат к JAVA_HOME, если ANDROID_STUDIO_JAVA_HOME не установлен.
Краткое дополнение к вышесказанному для openJDK 11 с инструментами android sdk перед обновлением до последней версии.
Вышеупомянутые решения не помогли мне
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."
Чтобы это заработало, я установил jaxb-ri (эталонная реализация) из репозитория maven.
Информация была предоставлена https://github.com/javaee/jaxb-v2 и ссылки на https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/2.3.2/jaxb-ri-2.3.2.zip
Эта загрузка включает в себя автономную реализацию среды выполнения в папке мода.
Я скопировал папку мода в $android_sdk\tools\lib\ и добавил в переменную 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;
Итак, наконец, это выглядит так:
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;
Возможно, я пропустил библиотеку из-за того, что появились незначительные ошибки. Но sdkmanager.bat --update или --list сейчас работает.
Это ответ, чтобы сделать эту работу для Java 11 и выше, поскольку все API-интерфейсы JAXB были удалены.
Загрузите Jakarta XML Binding, в частности этот zip- файл. Вам нужны только 3 файла в папке мода, то есть jakarta.activation.jar, jakarta.xml.bind-api.jar и jakarta.xml.bind-api.jar, а остальные вы можете выбросить.
Переместите эти файлы в папку APP_HOME/lib. Я создал для этого подпапку jaxb. Итак, в моей системе MacOS это было: $HOME/Library/Android/sdk/tools/lib/jaxb
Теперь откройте sdkmanager с помощью вашего любимого текстового редактора и в разделе CLASSPATH= добавьте следующее в начале:
$APP_HOME/lib/jaxb/jakarta.activation.jar:$APP_HOME/lib/jaxb/jakarta.xml.bind-api.jar:$APP_HOME/lib/jaxb/jaxb-impl.jar
В итоге получилось так:
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
И это в значительной степени должно решить проблему.
Я сделал эти шаги, потому что flutter doctor --android-licenses
доставлял мне проблемы. И это исправило это.
(ОКНА)
Если вы уже установили Android Studio, перейдите в
File
>>
Project Structure...
>> Местоположение SDK.
Перейти в это место +
\cmdline-tools\latest\bin
Скопируйте путь в
Environment Variables
чем нормально использовать инструмент командной строки.
As explained above by Saifur Rahman Mohsin, the problem is that relies on the availability of J2EE functionality which no longer ships with JRE/JDK >= 11, so this can be worked around by using the JAXB classes which implement the same functionality.
However, you may prefer not (or not be able to) modify the script (e.g. because it is installed by some other process that you do not control). If you are running a Posix/Unix system (like GNU/Linux or BSD, maybe macOS) you may still have a chance.
At least with the shipped with
sdk-tools-linux-4333796.zip
(maybe also with later versions), if you set
$JAVA_HOME
, it tries to look for
$JAVA_HOME/jre/sh/java
for IBM's AIX SDK compatibility. So you can exploit that compatibility check to trick into using a wrapper script that inserts the necessary classes into the class path when calling the real program.
For example, in Debian with OpenJDK 11 already installed (package
openjdk-11-jre
or
openjdk-11-jdk
) you can do this (as root):
# cd /usr/lib/jvm/java-11-openjdk-amd64 # use your Java home here
# mkdir -p jre/sh
# cd jre/sh
# touch java
# chmod a+rx java
Then edit the just-created
java
script and write this Bash code into it:
#!/bin/bash
cp="$JAVA_EXTRA_CLASSPATH" java="$JAVA_HOME/bin/java"
test "$cp" || exec "$java" "$@"
args=()
for arg in "$@"; do
if [[ "$setcp" ]]; then
cp="$arg:$cp" setcp=
elif [[ "$arg" =~ ^-(cp|-?classpath)$ ]]; then
setcp=y
else
args+=("$arg")
fi
done
exec "$java" -cp "$cp" "${args[@]}"
To make
sdkmanager
use the wrapper script and inject the JAXB classes into the class path, first install the relevant JAXB package in your system (
libjaxb-java
in Debian), and use
sdmanager
like this:
$ export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64" # for Debian's OpenJDK 11
$ export JAVA_EXTRA_CLASSPATH="/usr/share/java/jaxb-impl.jar" # for Debian's `libjaxb-java` package
$ (now run sdkmanager or other processes running it as usual)
Please note that has classpath syntax, so you can enter a colon-separated list of items.
I noticed that this trick also applies to the Gradle wrapper and maybe others, but they may be safe if
$JAVA_EXTRA_CLASSPATH
is not set.
JDK 13.0.1, Android SDK 29, Windows 10
В основном я пробовал все, но самым эффективным и единственным решением, которое сработало для меня, было понижение до jdk 1.8. Я не понимаю, почему, это начало 2020 года, и мне нужно перейти на версию jdk, которой исполнилось 1 год, вместо последней версии flutter. Возможно, проблема в версии для Windows, потому что jdk 13.0.1 работал у меня на macOS 10.15.2. Надеюсь, это решение сработает.
Ссылка для скачивания (JDK 1.8.0):https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Единственное рабочее решение для меня - использовать java, поставляемый со студией Android.
установите JAVA_HOME на /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home
в .bashrc
set JAVA_HOME="/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home"
Если вы используете fish
Шел, вставь это ~/.config/fish/config.fish
set -gx JAVA_HOME /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home
(Это для Mac, но я уверен, что он должен работать с Linux и Windows, задав правильный путь)
Очевидно, если вы используете версию commandlinetools выше 3.6.0, вы можете использовать JDK11+ для установки компонентов Android SDK.
Они доступны здесь: https://developer.android.com/studio.
Официальный трекер ошибок сообщает, что он исправлен: https://issuetracker.google.com/issues/122210344
Определите домашние каталоги разных версий JDK в вашем.bashrc или.zshrc:
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)
Прежде всего используйте JDK версии 8. Поместите эту строку в начало sdkmanager
файл:
export JAVA_HOME=$JAVA_8_HOME
Вернитесь к версии 14 JDK. Поместите эту строку в конец sdkmanager
файл:
export JAVA_HOME=$JAVA_14_HOME
Вам просто нужно установить файлы jaxb har и включить их в путь к классам. это работает в java с 11 по 12 последнее.
Для тех, кто ищет исправление, я сделал некоторую суть в github, надеюсь, это поможет. и ссылки также предоставляются.
https://gist.github.com/Try-Parser/b7106d941cc9b1c9e7b4c7443a7c3540
https://adoptopenjdk.net/ настоящее время поддерживает все дистрибутивы JDK начиная с версии 8 и выше. Например, https://adoptopenjdk.net/releases.html.
Вот пример того, как я смог использовать JDK версии 8 с sdkmanager и многое другое: https://travis-ci.com/mmcc007/screenshots/builds/109365628
Для JDK 9 (и я думаю, 10 и, возможно, 11, но не 12 и выше), должно работать следующее, чтобы sdkmanager работал:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
Для пользователей Mac я решил аналогичную проблему, изменив файл zshrc и добавив следующее (хотя ваш java_home может быть настроен по-другому):
export JAVA_HOME=$(/usr/libexec/java_home)
export ANDROID_HOME=/Users/YOURUSER/Library/Android/sdk
export PATH=$PATH:/Users/YOURUSER/Library/Android/sdk/tools
export PATH=$PATH:%ANDROID_HOME%\tools
export PATH=$PATH:/Users/YOURUSER/Library/Android/sdk
У меня чипсет M1, и единственным решением было установить JDK 8 от azul zuru, а затем изменить JAVA_HOME на 1.8 и все работает!
Перейти к
{SDK_FOLDER}/lib/_/
(папка подчеркивания). Скопируйте все файлы из
_
папку в ее родительскую папку
/lib
.
Другое возможное решение этой ошибки - проверить свою версию Java, возможно, вы сможете решить ее, загрузив этот jdk oracle-jdk-8, это была моя ошибка:P
Если вы используете флаттер, запустите эту команду
flutter doctor --android-licenses
Я скачиваю Java 8 SDK
- Предыдущая версия Unistall Java SDK
- закрыть студию Android
- установить Java 8
- запустить->
cmd-> flutter doctor --install -licenses
и после
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