web-dev-qa-db-ja.com

Java 9でsdkmanager --list(Android SDK)を実行できませんでした

私はダウンロードしてインストールしました:

  • OracleからのJDK(jdk-9.0.1_osx-x64_bin.dmgはこちら
  • GoogleからのAndroid SDK(sdk-tools-darwin-3859397.Zipはこちら

PATH変数を設定した後、私はsdkmanagerを実行してみました。これは、SDKコンポーネントを管理するためのAndroidコマンドに代わるものです。しかし、ここに示すように失敗しました。

$ 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に戻らずにそれを修正する方法を知っていますか?

関連する質問

この答え の助けを借りて、私は問題をうまく解決しました。

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パッケージが更新されるとtoolsシェルスクリプトがオーバーライドされる可能性があるため、sdkmanager --updateを実行した後に上記の修正を再度適用する必要があるかもしれません。

関連する回答

  • https://stackoverflow.com/a/43574427/142239
    • @ andy-guibertは、これを機能させるために必要なオプションを指摘しました。彼はまたそれらの不思議な選択が何を意味するのか簡単に述べました。

SDKMANAGER_OPTSを使用してsdkmanagerオプションを設定できます。

例:

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

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%

11
Sagar Khatri

これまでのコメントを読んでいるように、このエラーは現在の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のためにこのエラーを解決します

それを恒久的に保存するためには、Linux上のプロファイルファイル(.zshrc.bashrcなど)にあるJava_OPTSをエクスポートするか、またはWindows上で恒久的に環境変数として追加することができます。


ps。これは、Java EEモジュールがないJava 11以降では機能しません。このオプションは、Javaのバージョンを下げるか、Flutter の更新 を待つことをお勧めします。

参照: JDK 11:Java EEモジュールの道の終わり

8
coderade

私はこの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

AndroidツールはまだJDK 9または10と互換性がありません。JDK8をインストールする必要があります。複数のJavaバージョンが必要な場合は、システム全体のJavaホームがJDK 8を指すようにしてください。

詳細はこちら: AndroidをターゲットにしてOSXでのビルドエラーを回避するようにUnity 2017.4を設定するにはどうすればよいですか?

4
German

システムにJava 11がある場合、提供される解決策は無効です。

この-XX:+IgnoreUnrecognizedVMOptions --add-modules Java.se.ee or-- add-modules Java.xml.bindは、Mac OS上のJava 11では動作しません。

そのため、ここから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
3
thodwris

https://adoptopenjdk.net は現在、バージョン8以降のJDKのすべてのディストリビューションをサポートしています。例えば 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
0
mmccabe