Не вдалося запустити sdkmanager --list з Java 9


96

Я завантажив і встановив:

  • 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
Просто цікаво: яка мета цього робити?
GhostCat

2
Випробовуючи нові функції в Java 9, але одночасно розробляючи програми для Android, і просто потрібно один JDK в системі.
Siu Ching Pong -Asuka Kenji-

Відповідна відповідь не стосується Android SDK. Не вказано, який сценарій редагувати, а де редагувати. Зверніть увагу, що не всі знають сценарій оболонки, і це допомагає швидко вирішити проблему навіть людям, які знають. Ви хочете прочитати скрипт, не написаний вами, для вирішення простої проблеми конфігурації, тоді як робоче рішення вже випробувано кимось?
Siu Ching Pong -Asuka Kenji-

2
У цій ноті я проголосував за повторне відкриття stackoverflow.com/questions/46402772/…, навіть як зазначено в коментарях.
Наман

Будь ласка, не видаляйте це, поки stackoverflow.com/q/46402772/142239 не буде знову відкрито, і я скопіюю туди свою відповідь. У мене немає резервної копії моїх публікацій StackOverflow. Дякую!
Siu Ching Pong -Asuka Kenji-

Відповіді:


159

За допомогою цієї відповіді я успішно вирішив проблему.

Ми збираємось застосувати виправлення в sdkmanager. Це сценарій оболонки. Він знаходиться за адресою $android_sdk/tools/bin, $android_sdkде ви розпакували Android SDK.

  1. Відкрийте sdkmanagerу своєму улюбленому редакторі.
  2. Знайдіть рядок, який задає DEFAULT_JVM_OPTSзмінну. У моїй копії, це в рядку 31:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
    
  3. Додайте наступні параметри до змінної: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee. Будь ласка, зверніть увагу на цитати. У моїй копії рядок стає:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
    
  4. Збережіть файл і закрийте редактор.
  5. Виконайте команду ще раз.

Ось результат:

$ 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
...

Гола! Це працює!

- Редагувати: 2017-11-07 -

Зверніть увагу, що вам може знадобитися застосувати виправлення вище після запуску sdkmanager --update, оскільки sdkmanagerсценарій оболонки може бути замінений, якщо toolsпакет оновлений.

Відповідні відповіді

  • https://stackoverflow.com/a/43574427/142239
    • @ andy-guibert вказав необхідні варіанти, щоб зробити цю роботу. Він також коротко сказав, що означають ці загадкові варіанти.

1
Як зазначено у Посібнику з міграції JDK 9, це --add-modules java.se.eeслід розглядати як тимчасове рішення. Пропозиція вилучити модуль java.xml.bind з Java SE та JDK знаходиться в проекті тут: bugs.openjdk.java.net/browse/JDK-8189188
Алан Бейтман

11
Чому б просто не експортувати JAVA_OPTSзмінну середовища export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'замість того, щоб виправляти вихідні файли SDK?
Рафа

7
FWIW, я завантажив і встановив як JDK, так і Android SDK Tools сьогодні на Windows 10, і мені довелося встановити рядок таким чином, set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0.." -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eeщоб com.android.sdklib.tool.SdkManagerCliклас працював правильно
RJ Cuthbertson

2
коли в системі є Java 11, рішення, яке запропонував @SherylHohman, повинно поєднуватися з цим, java 11 має бути "прихованим" зі списку, щоб зробити цю роботу
Alejandro Moya

5
Цей -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eeабо `--add-модулі java.xml.bind не працюють з Java 11 у Mac OS. Як я можу це виправити, не встановлюючи іншу версію Java?
Manish

37

Ви можете встановити параметри sdkmanager за допомогою SDKMANAGER_OPTS.

Приклад:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list

4
Зверніть увагу, що у Windows слід опустити цитати:set SDKMANAGER_OPTS=--add-modules java.se.ee
Amfasis

20
java.se.ee вже не існує.
Оскар

2
Ця відповідь застаріла, хтось виправте це, будь ласка
Developerium

25

Прийнята відповідь застаріла станом на лютий 2019 року. Ось відповідь, яка діятиме до sdkmanagerпереходу на нову версію Java. Але до того часу у вас цієї проблеми вже не буде.

OpenJDK 10 був superseeded на 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

А зараз у мене є кілька трубопроводів для ремонту.


Ця відповідь мені допомогла, оскільки я тимчасово встановив JAVA_HOME верхню точку на встановлення Java з Android Studio: C: \ Program Files \ Android \ Android Studio \ jre
clzola

3
set JAVA_HOME="...\android-studio\current\jre"допомагає мені у Windows 10, тоді як на всі інші відповіді ні
NearHuscarl

set JAVA_HOME="C:\Program Files\Android\Android Studio\jre"працював зі мною у Windows 10. Знайдіть свій шлях до Android Studio. Я встановив Java 11 на своєму оригінальному JAVA_HOME
notes-jj

Це не буде працювати: Java 8 більше не існує в Debian stable (1½ року) та новішій.
mirabilos

20

При наявності Java 11 у системі надані рішення не є дійсними.

Цей -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or--add-модулі 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

1
Я зробив це і все ще отримую помилку: etc ... Виняток у потоці "main" java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema .. Я використовую Java 12.0.1
james emanon

@jamesemanon може зробити перезапуск, щоб застосувати зміни. Я не маю жодного поняття.
thodwris

1
bash: /usr/libexec/java_home: file not foundпри моїй установці.
Євген Гр. Філіппов

13

Для 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%


3
Працював у мене на вікнах 10.
AntonB

11

Оновлення 2019-10:

Як зазначено в трекері випусків , Google працює над новим випуском інструментів SDK, який працює на поточних JVM (9+)!

Ви можете завантажити та використовувати нові інструменти командного рядка Android SDK (1.0.0) всередині Android Studio або вручну завантажити їх із серверів Google:

Для останньої версії перевірте URL-адреси всередині repository.xml .

Якщо ви розпаковуєте інструменти командного рядка вручну, подбайте про те, щоб розмістити їх у підпапці всередині вашого $ANDROID_HOME(наприклад $ANDROID_HOME/cmdline-tools/...).


1
Інструменти командного рядка 2.1 (найновіші) теж зазнають невдач із Java 11.
mirabilos

10

Як ми читали в попередніх коментарях, ця помилка виникає, оскільки поточна версія 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.


ps. Це не працює для Java 11+, яка не має модулів Java EE. Для цього варіанту є гарною ідеєю знизити версію Java або дочекатися оновлення Flutter .

Посилання: JDK 11: Кінець дороги для модулів Java EE


12
Коли я спробую це, я отримую чергову помилку: Помилка сталася під час ініціалізації завантажувального шару java.lang.module.FindException: Модуль java.se.ee 'не знайдено
Sherin Binu

@SherinBinu, яку версію Java ви використовуєте?
valdeci

1
спробуйте використати --add-modules java.xml.bindзамість--add-modules java.se.ee
valdeci

@valdeci Це насправді спрацювало! Дуже дякую!
Apoorv Goyal

8

Як вже згадували деякі люди, це цілком може бути простішою проблемою, пов’язаною з тим, що одна установка Java має перевагу над іншою.

У моєму випадку це був java 8, який затьмарюється новим Java за замовчуванням.

Я встановив java 8:

sudo apt-get install openjdk-8-jdk

Потім я оновив встановлений java як новий за замовчуванням:

sudo update-alternatives --config java

Таким чином я вибрав ідентифікаційний номер Java 8.

Виконавши ці (досить прості) кроки, я міг просто запустити sdkmanager без помилок.

Сподіваюся, це комусь допомагає!


Це не буде працювати: Java 8 більше не існує в Debian stable (1½ року) та новішій.
mirabilos

7

Інструменти Android все ще несумісні з JDK 9 або 10. Вам потрібно встановити JDK 8 або, якщо вам потрібні кілька версій Java, переконайтеся, що загальносистемний дім Java вказує на JDK 8.

Детальніше тут: Як налаштувати Unity 2017.4 для націлювання на Android та уникнути збоїв збірки на OSX?


5

Мені було важко зрозуміти це рішення, просто додавши робочий 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

Я боюся, що це не життєздатний варіант, оскільки це перестане працювати, коли вийде нова версія SDK, оскільки цей фрагмент коду містить жорстко закодовані версії:set CLASSPATH=%APP_HOME%\lib\sdklib-25.3.1.jar
izogfif

4

Мені вдалося вирішити проблему за допомогою відредагованого файлу sdkmanager.bat, змусивши використовувати Java, вбудовану всередину Android Studio Itself, яка, як я припускаю, використовує 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 не встановлено.


3

Це те, що я зробив в 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)

Це не буде працювати: Java 8 більше не існує в Debian stable (1½ року) та новішій.
mirabilos

2

Короткий додаток до вищезазначеного для 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 \ 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 працює зараз.


2

Це відповідь, щоб зробити цю роботу для Java 11 і новіших версій, оскільки всі API JAXB були видалені.

Завантажте прив'язку XML в Джакарті , зокрема цей 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давав мені проблеми. І це виправило.


1

Єдине робоче рішення для мене - використовувати 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, встановивши правильний шлях)


Це може заважати іншим програмам, які намагаються використовувати оригінальну / не OpenJDK версію Java від Oracle. Незважаючи на те, що OpenJDK більш ніж здатний, комусь може знадобитися і інший.
Jemsheer KD

1

JDK 13.0.1, Android SDK 29, Windows 10

В основному я спробував усе, але найефективнішим і єдиним рішенням, яке працювало для мене, було зниження версії до jdk 1.8. Я не знаю, чому це на початку 2020 року, і мені доведеться перейти на 1-річну jdk-версію порівняно з останньою верстатою. Можливо, проблема у версії 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 8 була випущена в березні 2014 року. Отже, їй трохи більше 1 року ...
pqnet

так .. але політика Oracle змінилася з Java 8 ..... вона вже не є безкоштовною для організації. Отже, всі змушені користуватися Java8
Кедар Сукеркар,

Проблема полягає в тому, що новіші версії середовищ виконання Java (9+) не мають бібліотек javax, ви повинні їх доставити разом із вашим додатком. Отже, програмне забезпечення, написане для очікування роботи на Java 8 і раніше, не постачає ці бібліотеки і, отже, не працює на 9+. Причиною, як ви вже здогадалися, є зробити стандартний JDK повністю відкритим кодом (ці бібліотеки не є GPL), тому я б сказав, що умови ліцензії покращились.
pqnet

1

Визначте домашні каталоги різних версій 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

Поверніться до версії JDK 14. Помістіть цей рядок унизу sdkmanagerфайлу:

export JAVA_HOME=$JAVA_14_HOME

Це не буде працювати: Java 8 більше не існує в Debian stable (1½ року) та новішій.
mirabilos

1

(ВІКНА)

Якщо ви вже встановили Android Studio, перейдіть до File>> Project Structure...>> Розташування SDK.

Перейдіть до цього місця + \cmdline-tools\latest\bin Скопіюйте шлях уEnvironment Variables

чим можна використовувати інструмент командного рядка.


0

Наразі 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

1
Будь-яка ідея, як це виправити для SDK 12?
Річі

@Richie Ви вирішили це, у мене теж є Java 12 і я стикаюся з цим питанням, і нічого, що розміщено тут, не допомагає.
Джеймс Еманон,

1
Наскільки я пам’ятаю, я думаю, вам потрібно завантажити файл jar, який містить java.se.ee, і додати його до шляху (або чогось подібного). AFAIK Oracle роз’єднав банки, пов’язані з J2EE, від JDK на 12 і новіші версії. Не перевіряв це за допомогою sdkmanager.
mmccabe

@jamesemanon Мені не вдалося це вирішити. Спробуйте зазначену вище пропозицію
Річі

0

Іншим можливим рішенням цієї помилки є перевірка вашої версії Java, можливо, ви можете її вирішити, завантаживши цей jdk oracle-jdk-8 , це була моя помилка: P



0

Я завантажую Java 8 SDK

  1. unistall java sdk попередня версія -
  2. закрити андроїд-студію
  3. встановити java 8
  4. run-> 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

0

Очевидно, якщо ви використовуєте версію "commandlinetools", що перевищує 3.6.0, ви можете використовувати JDK11 + для встановлення компонентів Android SDK.

Вони доступні тут: https://developer.android.com/studio#command-tools

Офіційний трекер випуску повідомляє, що це виправлено: https://issuetracker.google.com/issues/122210344#comment11


-2

Це дуже просто, просто експортуйте JAVA_HOME змінну середовища, встановлену на шляху до вашої інсталяції JDK.

Я встановив Java вручну на Ubuntu, і для мене це виглядає так:

export JAVA_HOME="$HOME/pkg-src/jdk1.8.0_251"

І переконайтесь, що він існує і на вашому шляху ...

export PATH="$PATH:$JAVA_HOME"

Це не буде працювати: Java 8 більше не існує в Debian stable (1½ року) та новішій.
mirabilos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.