Не вдалося встановити android-sdk: “java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema”


167

Під час встановлення інструментів sdk для android видається така помилка:

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
Насправді це питання задає легітимну проблему з встановленням sdk для android при наявності java9
jontro

17
У мене є ця проблема, і я скопіював / вставив перший рядок свого повідомлення про помилку в google, і це питання було першим зверненням, яке виникло. Не тільки це, одна з відповідей нижче вирішила це. Це не повинно бути закритим: незалежно від правил запитань, це питання наочно відповідає цілі сайту.
Le Mot Juiced

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

2
Проблема виникає з 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 Kit Kit 8u144 . Сподіваюся, це допомагає.

  1. brew cask uninstall java # видалити 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, спробувала це, все ще не працює. Якісь поради?
Vedvart1

3
Чудово - це працювало для мене, будуючи додаток Flutter в Android Studio. Дякую!
Darragh Enright

20
Це припинило роботу, встановити заварений бочковий java8 не працює.
кди

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

21
brew cask install homebrew/cask-versions/adoptopenjdk8здається, працює
гуруз

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 w / OpenJDK 10.0.2
раставання

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 не знайдено
Ранді

2
Я також спробував 1.8.0_191, але все ще отримую: Помилка: Не вдалося знайти або завантажити основний клас java.se.ee
Ренді,

1
Цей варіант не потрібен для Java 8 і не працює для Java 11, у якій немає модулів Java EE.
valdeci

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

Це вирішило проблему в Windows для мене.

Джерело 1 , джерело 2


2
Також використовували це на ubuntu 16.04 (використовуючи exportне set), і це вирішило проблему.
Бенджамін Конлан

Геніальність. Дуже дякую. Думав, що мені доведеться змінити свій JVM
пластівці

1
Працював як шарм у Windows 10 з Java 10
pabz

4
На жаль, здається, повністю видалено в Java 11.
Alastair Maw

Працював 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
Сара А

Немає жодної /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
Jorge Valvert

15

Я знайшов дві відповіді, які працювали на мене, не потребуючи видалення JDK 10 (або 9), які мені потрібні create-react-app. І JDK 9, і 10 несумісні з android-sdk!


Siu Ching Pong -Asuka Kenji- пропонує змінити 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 виправило це, і попередній випуск пішов ..
4рівні

3
На жаль, зараз це не працює. Результат: Помилка під час ініціалізації завантажувального шару java.lang.module.FindException: Модуль java.se.ee не знайдено
Оскар

1
Upvoted stackoverflow.com/a/49630166/5411817 за те, що правильне рішення для зберігання JDK-11 і jdk1.8 встановлений без зниження
harrisjb

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-адреси всередині сховища.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, вам потрібно буде завантажити кілька банок і додати до classpath:

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 порушує власні правила);)
Пітер Квірінг

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. Будь ласка, видаліть його спочатку, перш ніж виконати дії з цієї відповіді.
Меч Джейсон

4

Я зіткнувся з тією ж проблемою. Хоча я трохи забутий розробник (все ще використовую Windows для розробки: P)

Щоб вирішити цю проблему у Windows :

КРОК 1: Встановіть jdk 8, якщо він не був встановлений (jdk 9 або 11 не працює, але ви можете встановити їх для використання в інших програмах розробки).

Дуже просто, використовуючи Chocolatey:

choco встановити jdk8

(Якщо встановлено за допомогою Chocolatey, пропустіть кроки 2 та 3)

КРОК 2: Перейдіть до налаштувань змінних середовища і встановіть JAVA_HOME TO jdk 8 в інсталяційний каталог.

JAVA_HOME

КРОК 3: Перейдіть до змінної контуру та додайте каталог бін jdk 8 і перемістіть його вгору.

Шлях_змінний

КРОК 4: Закрийте будь-які відкриті сеанси терміналу та перезавантажте новий сеанс

ОПЦІЙНИЙ КРОК 5: Залежно від вашої мети в запуску терміналу (можливо, потрібно буде додати sdkmanager до шляху або просто перейти до каталогу):

sdkmanager - оновлення

Це все! : O Насолоджуйтесь мерехтінням! : D


1
Це разом із головною відповіддю працювало для мене на Windows 10!
mauriii

THANKSSSSSSSSSSSSSS
Джоші

2

Для Windows машини видаліть JDK, якщо його більше 1.8.172. Встановіть JDK 1.8.172

Я зіткнувся з тією ж проблемою в Windows 10 з java 10. Я видалив java 10 і встановив java8 його працює нормально для мене зараз :)


2

Для користувачів Linux (я використовую Debian Distro, Kali) Ось як я вирішив свою.

Якщо у вас ще немає jdk-8, ви хочете отримати його на сайті Oracle

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-Installing-Java-on-Kali-Linux також встановлено модуль за замовчуванням для mozilla. Я припускаю, що нам не потрібні плагіни, оскільки ми просто намагаємося розробити для Android.
  2. Як і у відповіді @ spassvogel, ви також повинні розмістити файл @ repositories.cfg у каталозі ~ / .android, оскільки це потрібно для оновлення списків репо інструментів.
  3. Для переміщення деяких речей може знадобитися коренева влада. Використовуйте судо розумно.
  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: \ Користувачі \ Milan Adhikari \ AppData \ Local \ Android \ Sdk \ tools" та запустити "sdkmanager --update", який оновить ваш sdk, а потім вам потрібно запустити "flutter doctor - -android-ліцензії "в 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. Яку б не було систему чи ідею.

Переконайтеся, що версія java не вище 8

У моєму випадку. Я змінюю версію ide java. Це вирішує мою проблему. введіть тут опис зображення


0

Коли ваш Android stuio / jre використовує іншу версію Java, ви отримаєте цю помилку. щоб вирішити це, просто встановіть студію Android / 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.