web-dev-qa-db-fra.com

Impossible d'exécuter sdkmanager --list (Android SDK) avec Java 9

J'ai téléchargé et installé:

  • JDK (jdk-9.0.1_osx-x64_bin.dmg) de Oracle ici
  • Android SDK (sdk-tools-darwin-3859397.Zip) de Google ici .

Après avoir configuré la variable PATH, j'ai essayé d'exécuter sdkmanager, qui a remplacé la commande Android pour la gestion des composants du SDK. Cependant, cela a échoué comme indiqué ici:

$ 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

Voici la version 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)

Est-ce que quelqu'un sait comment y remédier sans revenir à Java 8?

Questions connexes

Avec l'aide de cette réponse , j'ai résolu le problème avec succès.

Nous allons appliquer un correctif dans sdkmanager. C'est un script shell. Il se trouve à $Android_sdk/tools/bin, où $Android_sdk est l'endroit où vous avez dézippé le SDK Android. 

  1. Ouvrez sdkmanager dans votre éditeur préféré.
  2. Localisez la ligne qui définit la variable DEFAULT_JVM_OPTS. Dans ma copie, c'est à la ligne 31:

    DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME"'
    
  3. Ajoutez les options suivantes à la variable: -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee. S'il vous plaît prêter attention aux citations. Dans ma copie, la ligne devient:

    DEFAULT_JVM_OPTS='"-Dcom.Android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'
    
  4. Enregistrez le fichier et quittez l'éditeur.
  5. Exécutez la commande à nouveau.

Voici le résultat:

$ 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! Ça marche!

- Edit: 2017-11-07 -

Notez que vous devrez peut-être appliquer à nouveau le correctif ci-dessus après avoir exécuté sdkmanager --update, car le script shell sdkmanager peut être remplacé si le package tools est mis à jour.

Réponses connexes

Vous pouvez définir les options de sdkmanager avec SDKMANAGER_OPTS.

Exemple:

export SDKMANAGER_OPTS="--add-modules Java.se.ee"
sdkmanager --list
24
bempa

Pour Windows, si rien ne fonctionne, essayez ceci:

  • Ouvrez sdkmanager.bat avec le Bloc-notes.

  • Localisez la ligne suivante:

    %Java_EXE%" %DEFAULT_JVM_OPTS% %Java_OPTS% %SDKMANAGER_OPTS%

  • Ajouter --add-modules Java.xml.bind

La ligne modifiée devrait ressembler à ceci:

%Java_EXE%" %DEFAULT_JVM_OPTS% --add-modules Java.xml.bind %Java_OPTS% %SDKMANAGER_OPTS%

6
Sagar Khatri

Comme nous l'avons lu dans les commentaires précédents, cette erreur se produit car la version actuelle du SDK est incompatible avec les dernières versions de Java: 9 et 10.

Donc, pour le résoudre, vous pouvez rétrograder votre version de Java vers Java 8 ou pour contourner le problème, vous pouvez exporter l'option suivante sur votre terminal:

Linux:

export Java_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'

Les fenêtres :

set Java_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee'

Cela résoudra cette erreur pour la variable sdkmanager

Et pour le sauvegarder définitivement, vous pouvez exporter Java_OPTS dans votre fichier de profil sous linux (.zshrc, .bashrc et etc.) ou ajouter la variable d’environnement de façon permanente sous Windows.

5
coderade

J'ai eu du mal à comprendre cette solution en ajoutant simplement le travail 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
5
victorjpe

Les outils Android sont toujours incompatibles avec JDK 9 ou 10. Vous devez installer JDK 8 ou, si vous avez besoin de plusieurs versions de Java, assurez-vous que le répertoire principal Java du système pointe vers un JDK 8.

Plus de détails ici: Comment configurer Unity 2017.4 pour cibler Android et éviter les échecs de construction sous OSX?

3
German

J'ai pu résoudre le problème en utilisant un fichier sdkmanager.bat édité en forçant à utiliser le Java intégré au Android Studio lui-même, qui, je suppose, utilise l'OpenJDK 8. Voici: le sdkmanager que j'ai utilisé:

@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

Ici, j'ai utilisé une variable d'environnement Android_STUDIO_Java_HOME qui pointe en fait sur le JRE intégré dans le studio Android, par exemple: ../Android_studio/jre

Cela a également un effet de secours sur Java_HOME si Android_STUDIO_Java_HOME n'est pas défini.

3
Jemsheer K D

Lorsque Java 11 est présent dans le système, les solutions fournies ne sont pas valides.

Ce -XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee or-- add-modules Java.xml.bind ne fonctionne pas avec Java 11 sur Mac OS. 

Pour cette raison, vous devez rétrograder la version Java à la version 8 à partir d’ici: http://www.Oracle.com/technetwork/Java/javase/downloads/jdk8-downloads-2133151.html

Liste des versions Java installées

/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)

Ensuite aller à 

cd ~/Library/Android/sdk/tools/bin

et

./sdkmanager --licenses
0
thodwris

La réponse acceptée est obsolète en février 2019. Voici une réponse qui fonctionnera jusqu'à ce que sdkmanager migre vers une version plus récente de Java. Mais d'ici là, vous n'aurez plus ce problème.

OpenJDK 10 a été remplacé par OpenJDK 11 , ce qui n'implémente pas Java.se.ee du tout . Cela signifie que le fait d'ajouter --add-modules Java.se.ee ne fait plus rien. Cela signifie également qu'OpenJDK 10 sera automatiquement supprimé de votre système et remplacé par OpenJDK 11 lors de la prochaine mise à jour, si vos mises à jour sont configurées correctement.

Modifiez sdkmanager pour utiliser Java 8 en définissant Java_HOME à l'intérieur de sdkmanager en Java 8 installation. C'est, par défaut, à ~/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\.."

De cette façon, vous pouvez continuer à utiliser une version saine et maintenue de Java sur votre système tout en utilisant simultanément sdkmanager.

# Java
export Java_HOME=/usr/lib/jvm/default-Java

Et maintenant, j'ai quelques pipelines à réparer.

0
NatoBoram

https://adoptopenjdk.net supporte actuellement toutes les distributions de JDK à partir de la version 8. Par exemple https://adoptopenjdk.net/releases.html#x64_win

Voici un exemple de la façon dont j'ai pu utiliser JDK version 8 avec sdkmanager et bien plus encore: https://travis-ci.com/mmcc007/screenshots/builds/109365628

Pour JDK 9 (et 10, et éventuellement 11, mais pas 12 et au-delà), les éléments suivants devraient permettre à sdkmanager de fonctionner:

export SDKMANAGER_OPTS="--add-modules Java.se.ee"
sdkmanager --list
0
mmccabe