Не удалось запустить 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?
Вопросы по теме
- Не удалось установить android-sdk: "java.lang.Ошибка NoClassDefFoundError: javax / xml /bind / annotation / XMLSchema"
- В этом сообщении задавался аналогичный вопрос. Однако сообщение закрыто, и единственный ответ предлагает вернуться к Java 8.
ПРЕДУПРЕЖДЕНИЕ
Пожалуйста, обратите внимание, что я уже упоминал выше, что возврат к 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
сценарий оболочки может быть переопределен при обновлении tools
пакета.
Ответы по теме
- https://javalang.ru/a/43574427/142239
- @andy-guibert указал необходимые параметры, чтобы заставить это работать. Он также кратко объяснил, что означают эти загадочные параметры.
Ответ 2
Принятый ответ устарел по состоянию на февраль 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И теперь у меня есть несколько конвейеров для ремонта.
Ответ 3
Вы можете установить параметры sdkmanager с помощью SDKMANAGER_OPTS.
Пример:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
Ответ 4
Установите инструменты командной строки в SDK Manager через 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)