Не удалось запустить sdkmanager --list с Java 9
Я загрузил и установил:
- JDK (
jdk-9.0.1_osx-x64_bin.dmg
) от Oracle здесь - Android SDK (
sdk-tools-darwin-3859397.zip
) от Google здесь.
После настройки переменной 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?
Связанные вопросы
Ответы
Ответ 1
С помощью этого ответа я успешно решил проблему.
Мы собираемся применить исправление в 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
оболочки sdkmanager
может быть переопределен, если пакет tools
обновлен.
Ответы на вопросы
- fooobar.com/questions/67174/...
- @andy-guibert указал на необходимые варианты для этой работы. Он также кратко говорит о том, что означают эти загадочные варианты.
Ответ 2
Вы можете установить параметры sdkmanager с помощью SDKMANAGER_OPTS.
Пример:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
Ответ 3
Для 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%
Ответ 4
Как мы читали в предыдущих комментариях, эта ошибка происходит, потому что текущая версия 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 11+, в которой нет модулей Java EE. Для этой опции хорошая идея, понизьте версию Java или дождитесь обновления Flutter.
Ссылка: JDK 11: Конец пути для модулей Java EE
Ответ 5
При наличии 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
Ответ 6
Инструменты Android по-прежнему несовместимы с JDK 9 или 10. Вам нужно установить JDK 8 или, если вам нужно несколько версий Java, убедитесь, что в общем объеме Java Java указывает на JDK 8.
Подробнее здесь: Как настроить Unity 2017.4 для Android и избежать сбоев сборки в OSX?
Ответ 7
Мне было сложно определить это решение, просто добавив рабочий файл 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
Ответ 8
Я смог решить эту проблему, используя отредактированный файл 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 не установлен.
Ответ 9
Принятый ответ устарел по состоянию на февраль 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
And now I've got some pipelines to repair.
Ответ 10
Короткое дополнение к описанному выше для 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
Эта загрузка включает в себя отдельную реализацию во время работы с мод-папкой.
Я скопировал папку Mod в папку $ android_sdk\tools\lib\и добавил в переменную classpath следующее:
;% APP_HOME%\Lib\мод\jakarta.xml.bind-api.jar;% APP_HOME%\Lib\мод\jakarta.activation-api.jar;% APP_HOME%\Lib\мод\JAXB-runtime.jar;% APP_HOME%\Lib\мод\istack-Обще-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 запущен.
Ответ 11
https://adoptopenjdk.net в настоящее время поддерживает все дистрибутивы JDK начиная с версии 8 и выше. Например, https://adoptopenjdk.net/releases.html#x64_win.
Вот пример того, как я смог использовать 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
Ответ 12
Единственное рабочее решение для меня - использовать 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
shel, поместите это в ~/.config/fish/config.fish
set -gx JAVA_HOME /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home
(Это для Mac, но я уверен, что он должен работать с Linux и Windows, указав правильный путь)
Ответ 13
Другим возможным решением этой ошибки является проверка вашей версии Java, возможно, вы можете решить ее, загрузив этот jdk oracle-jdk-8, это была моя ошибка: P