Не удалось установить Android-SDK: «java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema»


167

При установке инструментов Android SDK появляется следующая ошибка:

java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema

Почему это происходит и как это можно исправить?

Отладочный вывод:

$ java --version
java 9
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
$ brew cask install android-sdk
==> Caveats
We will install android-sdk-tools, platform-tools, and build-tools for you.
You can control android sdk packages via the sdkmanager command.
You may want to add to your profile:
  'export ANDROID_SDK_ROOT=/usr/local/share/android-sdk'

This operation may take up to 10 minutes depending on your internet connection.
Please, be patient.

==> Satisfying dependencies
==> Downloading https://dl.google.com/android/repository/sdk-tools-darwin-3859397.zip
Already downloaded: /Users/tomasnovella/Library/Caches/Homebrew/Cask/android-sdk--3859397,26.0.1.zip
==> Verifying checksum for Cask android-sdk
==> Installing Cask android-sdk
==> 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
Error: Command failed to execute!

==> Failed command:
/usr/local/Caskroom/android-sdk/3859397,26.0.1/tools/bin/sdkmanager tools platform-tools build-tools;26.0.1

==> Standard Output of failed command:


==> Standard Error of failed command:
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)

Я предполагаю, что ваш вопрос "Что является причиной этой ошибки?" Ответ в том, что он не может найти классы javax.xml.
Стив Смит

28
На самом деле этот вопрос задает законные проблемы с установкой Android SDK при наличии java9
jontro

17
У меня есть эта проблема, и я скопировал / вставил первую строку моего сообщения об ошибке в Google, и этот вопрос был первым попаданием. Мало того, один из ответов ниже решил это. Это не должно быть полностью закрыто: независимо от того, каковы правила вопросов, этот вопрос полностью соответствует цели сайта.
Le Mot Juiced

1
Удалите что-нибудь старше, чем Java 8 из/Library/Java/JavaVirtualMachines
Димитрис

3
Проблема возникает с Java 8 и Java 11 на Ubuntu 18.04 с использованием пакетов openjdk-8-jdkи openjdk-11-jdk. Кто-нибудь знает, для чего устанавливать javax/xml/bind/annotation/XmlSchemaили как избежать javax/xml/bind/annotation/XmlSchemaв NDK?
jww

Ответы:


138

Сегодня утром у меня была похожая проблема (пытался собрать для Android с помощью Unity3D). В итоге я удалил JDK9 и установил Java SE Development Kit 8u144 . Надеюсь это поможет.

  1. brew cask uninstall java # uninstall java9
  2. brew tap homebrew/cask-versions
  3. brew cask install java8 # установить java8
  4. touch ~/.android/repositories.cfg # без этого файла ошибка произойдет на следующем шаге
  5. brew cask install android-sdk

2
Получил ошибку в Windows 10, попробовал это, все еще не работает. Какие-нибудь советы?
Ведварт1

3
Отлично - это помогло мне создать приложение Flutter в Android Studio. Спасибо!
Дарра Энрайт

20
Это перестало работать, brew cask установить java8 не работает.
kdy

4
правильная команда, кажется, сейчасbrew cask install homebrew/cask-versions/java8
Цезарсоль

21
brew cask install homebrew/cask-versions/adoptopenjdk8Кажется, работает
guruz

82

Чтобы устранить эту ошибку, вы можете понизить версию Java.

Или экспортирует следующую опцию на свой терминал:

Linux / MAC:

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

Windows :

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

И , чтобы сохранить его навсегда вы можете экспортирует JAVA_OPTSв своем профиле файл на Linux ( .zshrc, .bashrcи т.д.) или добавить в качестве переменной окружения постоянно на Windows.


пс. Это не работает для Java 11+, в которой нет модулей Java EE. Для этой опции хорошая идея, понизьте версию Java или дождитесь обновления Flutter .

Ссылка: JDK 11: Конец пути для модулей Java EE


6
Это работает для меня в Ubuntu 18.04 ж / OpenJDK 10.0.2
rastating

3
У меня работал на macOS Mojave (10.14.2) с версией Java "10.0.1" 2018-04-17.
Subfuzion

4
Создана новая ошибка для меня в macOS Mojave (10.14.2): ошибка произошла во время инициализации загрузочного слоя java.lang.module.FindException: модуль java.se.ee не найден
Randy

2
Я также пробовал 1.8.0_191, но все еще получаю: Ошибка: Не удалось найти или загрузить основной класс java.se.ee
Рэнди

1
Эта опция не нужна для Java 8 и не работает для Java 11, в которой нет модулей Java EE.
Вальдечи

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

Это исправило проблему в Windows для меня.

Источник 1 , источник 2


2
Также использовал это на Ubuntu 16.04 ( exportне используя set), и это решило проблему.
Бенджамин Конлан

Genius. Спасибо. Думал, что мне придется сменить JVM
хлопья

1
Работал как шарм на Windows 10 с Java 10
pabz

4
К сожалению, это, кажется, было полностью удалено в Java 11.
Аластер Мо

Работал export JAVA_OPTS = '-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'над Ubuntu 18.04
e2-e4

25

Если вы не хотите менять свою версию Java (я не хочу), вы можете временно изменить версию в вашей оболочке:

Первый забег

/usr/libexec/java_home -V

Затем выберите основную версию, если она установлена, иначе сначала установите ее:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

Теперь вы можете запустить sdkmanager.


2
$ /usr/libexec/java_home -Vдает bash: /usr/libexec/java_home: No such file or directory. apt-file search /usr/libexec/java_homeничего не дает
Тино

Вы правильно установили $ JAVA_HOME? Выполнить: echo "export JAVA_HOME=`/usr/libexec/java_home`" >> ~/.bashrc(или профиль, если вы используете профиль) - перезагрузить:. ~/.bashrc
Сара A

Там /usr/libexecтоже нет . Вы на MacOS? (Я нахожусь на Ubuntu / Linux и Ubuntu / Windows)
Тино

Я использую Mac. где твой Java_home?
Сара

21

В Mac / Linux используйте следующую команду:

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

Работает как для JDK 9, так и для 10, без каких-либо исправлений для скрипта (sdkmanager, avdmanager).

Для Java 11 см .: https://stackoverflow.com/a/51644855/798165


1
Спасибо! это решает проблему, когда вы установили JDK 9
Хорхе Вальверт

15

Я нашел два ответа, которые работали для меня, без необходимости удалять JDK 10 (или 9), который мне нужен create-react-app. JDK 9 и 10 несовместимы с Android-SDK!


Сиу Чинг Понг - Асука Кэндзи - предлагает изменить sdkmanagerскрипт, заменив эту строку:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'  

с участием:

DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

Обратите внимание, что этот мод будет перезаписан при обновлении sdkmanager.
Проверьте его пост, и тот, на который он ссылается, для более подробной информации.
Это решение было также одним из решений, упомянутых в этой теме о проблемах github .


Пост Германии указывает источник конфликта и представляет исправление, которое не будет перезаписано обновлениями.
Он предлагает переименовать /Library/Java/JavaVirtualMachines/Info.plistкак средство скрытия его от сценария, который ищет самую высокую версию Java, которая находится в вашей системе. Таким образом, JDK 8 возвращается по умолчанию.
Ссылаясь на JDK 10 явно или установив его $JAVA_HOME, вы можете использовать JDK 10 вместо значения по умолчанию, когда это необходимо.
Подробности в его посте.


1
Сработало отлично, лучшее решение ИМХО, так как оно не заставляет вас понижать
версию

Почему-то после долгих экспериментов с ао. В Android Studio эта проблема исчезла, и появилась новая ошибка: Could not find or load main class java.se.eeисправление DEFAULT_JVM_OPTS исправило эту проблему, и предыдущая проблема исчезла.
уровня

3
К сожалению, сейчас это не работает. Результат: ошибка произошла во время инициализации загрузочного слоя java.lang.module.FindException: модуль java.se.ee не найден
Оскар

1
Upvoted stackoverflow.com/a/49630166/5411817 за наличие правильного решения для сохранения jdk-11 и jdk1.8 без понижения
версии

15

Вам необходимо добавить следующее в свой профиль (работает на MacOS):

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

Не нужно ничего исправлять.


15

Просто установите JDK версии 8 и выберите его по умолчанию, используя:

sudo update-alternatives --config java

11

Обновление 2019-10:

Как указано в системе отслеживания проблем , Google работает над новым выпуском Инструментов командной строки Android SDK, который работает на текущих JVM (9, 10, 11+) и не зависит от устаревших модулей JAXB EE!

Вы можете загрузить и использовать новые инструменты командной строки Android SDK в Android Studio или загрузить их вручную с серверов Google:

Для получения последних версий проверьте URL-адреса внутри repository.xml .

Если вы вручную распаковываете инструменты командной строки, позаботьтесь о том, чтобы поместить их в подпапку внутри вашей $ANDROID_HOME(например $ANDROID_HOME/cmdline-tools/...).


1
При использовании Java 9+ это должно быть ответом отныне!
Луиджи Мендоса

9

Странно, но Java9 не совместима с Android-SDK

$ avdmanager
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.AvdManagerCli.run(AvdManagerCli.java:213)
    at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
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

Объедините все команды в одну для удобства:

$ sudo rm -fr /Library/Java/JavaVirtualMachines/jdk-9*.jdk/
$ sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$ sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefPane

$ /usr/libexec/java_home -V
Unable to find any JVMs matching version "(null)".
Matching Java Virtual Machines (0):
Default Java Virtual Machines (0):
No Java runtime present, try --request to install

$ brew tap caskroom/versions
$ brew cask install java8
$ touch ~/.android/repositories.cfg
$ brew cask install android-sdk
$ echo 'export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"' >> ~/.bash_profile
$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
$ avdmanager

Usage:
      avdmanager [global options] [action] [action options]
      Global options:
  -s --silent     : Silent mode, shows errors only.
  -v --verbose    : Verbose mode, shows errors, warnings and all messages.
     --clear-cache: Clear the SDK Manager repository manifest cache.
  -h --help       : Help on a specific command.

Valid actions are composed of a verb and an optional direct object:
-   list              : Lists existing targets or virtual devices.
-   list avd          : Lists existing Android Virtual Devices.
-   list target       : Lists existing targets.
-   list device       : Lists existing devices.
- create avd          : Creates a new Android Virtual Device.
-   move avd          : Moves or renames an Android Virtual Device.
- delete avd          : Deletes an Android Virtual Device.

8

Поскольку Java 11 удалила JavaEE, вам нужно скачать несколько jar-файлов и добавить в путь к классам:

JAXB: https://javaee.github.io/jaxb-v2/

JAF: https://www.oracle.com/technetwork/articles/java/index-135046.html

Затем отредактируйте sdkmanager.bat так, чтобы настройка CLASSPATH = ... заканчивалась на ;% CLASSPATH%

Установите CLASSPATH, чтобы включить JAXB и JAF:

set CLASSPATH=jaxb-core.jar;jaxb-impl.jar;jaxb-api.jar;activation.jar

Тогда sdkmanager.bat будет работать.


Это работает, но я получаю это предупреждение: ПРЕДУПРЕЖДЕНИЕ: незаконный рефлексивный доступ от com.sun.xml.bind.v2.runtime.reflect.opt.Injector (файл: / F: / android_sdk / java / jaxb-ri / lib / jaxb -impl.jar) в метод java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int)
AndyMc

Похоже, Java начинает предупреждать против плохой практики программирования использования отражения для обхода безопасности классов, которую использует JAXB (Oracle нарушает свои собственные правила);)
Питер Квайринг

5

Я столкнулся с той же проблемой. Хотя я немного отсталый разработчик (все еще использую windows для разработки: P)

Чтобы решить эту проблему на окнах :

ШАГ 1. Установите jdk 8, если он не был установлен (jdk 9 или 11 не работает, но вы можете установить их для использования в других целях).

Очень просто, используя Chocolatey:

Choco установить JDK8

(Если установлен с использованием Chocolatey, пропустите шаги 2 и 3)

ШАГ 2. Перейдите в настройки переменных среды и установите JAVA_HOME в каталог установки jdk 8.

JAVA_HOME

ШАГ 3: Перейдите к переменной path, добавьте каталог bin в jdk 8 и переместите его в начало.

Path_varriable

ШАГ 4: Закройте все открытые сеансы терминала и перезапустите новый сеанс

ДОПОЛНИТЕЛЬНЫЙ ШАГ 5: В зависимости от вашей цели при запуске терминала (может потребоваться добавить sdkmanager в путь или просто перейти в каталог):

sdkmanager --update

Вот и все! : O Насладись трепетом! : D


1
Это вместе с главным ответом работало для меня на Windows 10!
Мауриии

THANKSSSSSSSSSSSSSS
Джоши

Работает! Я просто хочу добавить, что если вы используете код VS, вы должны перезапустить программу после этого изменения
Антонио Рейес

4

Я столкнулся с той же проблемой при запуске:

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"_

Я решил это как

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home    

$ ls /Library/Java/JavaVirtualMachines/

jdk-11.0.1.jdk      
jdk1.8.0_202.jdk

Измените Java для использования 1.8

$ export JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home'

Тогда та же команда работает нормально

$ /Users/<username>/Library/Android/sdk/tools/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3"

Это лучший случай. Если вы уже экспортируете JAVA_OPTS. Пожалуйста, удалите его сначала, прежде чем делать шаги из этого ответа.
Меч Джейсон

2

Для Windows машина удалите JDK, если его больше, чем 1.8.172. Установите JDK 1.8.172

Я столкнулся с той же проблемой в windows 10 с java 10. Я удалил java 10 и установил java8, теперь он работает нормально для меня :)


2

Для пользователей Linux (я использую Debian Distro, Kali) Вот как я решил свой.

Если у вас еще нет jdk-8, вы хотите получить его на сайте оракула

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Я получил jdk-8u191-linux-x64.tar.gz

Шаг 1 - Установка Java Move и распакуйте его в подходящем месте, как это

$ mv jdk-8u191-linux-x64.tar.gz /suitablelocation/
$ tar -xzvf /suitablelocation/jdk-8u191-linux-x64.tar.gz

Вы должны получить разархивированную папку, такую ​​как jdk1.8.0_191. После этого вы можете удалить архив, чтобы сэкономить место

Шаг 2 - Настройка альтернатив местоположению Java по умолчанию

$ update-alternatives --install /usr/bin/java java /suitablelocation/jdk1.8.0_191/bin/java 1
$ update-alternatives --install /usr/bin/javac javac /suitablelocation/jdk1.8.0_191/bin/javac 1

Шаг 3 - Выбор альтернатив по умолчанию

$ update-alternatives --set java /suitablelocation/jdk1.8.0_191/bin/java
$ update-alternatives --set javac /suitablelocation/jdk1.8.0_191/bin/javac

Шаг 4 - Подтверждение версии Java по умолчанию

$ java -version

Ноты

  1. В оригинальной статье здесь: https://forums.kali.org/showthread.php?41-Install-Java-on-Kali-Linux также был установлен плагин по умолчанию для Mozilla. Я предполагаю, что нам не нужны плагины, так как мы просто пытаемся разработать для Android.
  2. Как и в ответе @ spassvogel, вы также должны поместить файл @ repositories.cfg в каталог ~ / .android, поскольку это необходимо для обновления списков репозитория инструментов.
  3. Для перемещения некоторых вещей могут потребоваться полномочия root. Используйте sudo с умом.
  4. Для использования sdkmanager см. Официальное руководство: https://developer.android.com/studio/command-line/sdkmanager

1

Запустите java -versionи javac -versionкоманды в командной строке, чтобы убедиться, что они приходят из того же JDK (например: версия 1.8.0_181)

Если нет, вы должны изменить PATHпеременную так, чтобы она указывала только на один JDK. Если вы не уверены, как это сделать, просто удалите все другие экземпляры Java, кроме Java 8 (Установка и удаление программ в Windows). На сегодняшний день Unity и Android рекомендуют использовать JDK 8.

В Java 8 нет необходимости экспортировать java.se.eeмодуль, как показано в некоторых других ответах. Вы также можете удалить любые JAVA_OPTSили другие переменные среды, которые вы установили.


1

Недавно я решил эту проблему, удалив более высокую версию JDK и установив JDK 8. После установки JDK необходимо указать путь. Затем вам нужно открыть командную строку в «C: \ Users \ Milan Adhikari \ AppData \ Local \ Android \ Sdk \ tools» и запустить «sdkmanager --update», который обновит ваш sdk, а затем вам нужно запустить «flutter doctor - -android-licenses "в cmd и принять все лицензии.
Теперь ваша проблема должна быть решена.


1

В моем случае мне нужны JDK 8 (пытаюсь использовать менеджер AVD и SDK в Qt под Ubuntu) и 11 для разных инструментов. Удаление версии 11 не вариант.

Решения 'JAVA_OPTS' ничего не сделали. Мне не очень нравится экспорт JAVA_HOME, поскольку он может заставить вас запустить любой инструмент, вызывающий эти утилиты из той же оболочки (например, Qt), или заставить сделать его постоянным, что не удобно.

Так что для меня решение довольно простое. Добавьте что-то вроде этого во второй строке ~ / Android / tools / bin / sdkmanager и ~ / Android / tools / bin / avdmanager:

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

(или какой-либо путь к вашей версии 8 JDK).

При этом эти инструменты командной строки работают в автономном режиме, они также работают при вызове другими инструментами, такими как Qt, а jdk 11 по-прежнему является системной настройкой по умолчанию для других. Нет необходимости смешивать библиотеки и т.д.

Единственным недостатком является то, что любое обновление этих инструментов командной строки удалит эти изменения, которые вы должны будете вернуть обратно.


ВЕРХНЯЯ! Спасибо!
Фундер

0

Понизьте вашу версию Java. Независимо от системы или ide.

Убедитесь, что версия Java не выше 8

В моем случае. Я изменяю ide java verion. Это решает мою проблему. введите описание изображения здесь


0

Когда ваш Android Stuio / JRE использует другую версию Java, вы получите эту ошибку. чтобы решить эту проблему, просто установите Android studio / jre на свой JAVA_HOME. и удалите свою собственную Java.



0

Для моих обстоятельств я использую sdkman для управления несколькими версиями Java. Я установил версию Java по умолчанию на 13. Установите версию 8, и теперь она работает нормально.


0

Лучший способ - использовать приведенную ниже команду

   $ wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
   $ unzip \platform-tools-latest-linux.zip
   $ sudo cp platform-tools/adb /usr/bin/adb
   $ sudo cp platform-tools/fastboot /usr/bin/fastboot

Теперь запустите версию ADB, чтобы убедиться, что она обновлена.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.