ProgramingTip

Java 9에서 sdkmanager --list (Android SDK) 실행 실패

bestdevel 2020. 10. 20. 07:53
반응형

Java 9에서 sdkmanager --list (Android SDK) 실행 실패


다음을 다운로드하여 설치했습니다.

  • jdk-9.0.1_osx-x64_bin.dmgOracle의 JDK ( ) 여기
  • sdk-tools-darwin-3859397.zipGoogle의 Android SDK ( )는 여기 .

PATH변수를 구성한 후 SDK 구성 요소 관리 명령을 sdkmanager대체하는 실행 해 보았습니다 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당신은 안드로이드 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쉘 펼쳐야 오버라이드 (override) 할 수있다 tools패키지가 업데이트됩니다.

관련 답변

  • https://stackoverflow.com/a/43574427/142239
    • @ andy-guibert는이 작업을 수행하는 데 필요한 옵션을 지적했습니다. 그는 또한 그 신비한 옵션이 의미하는 바를 간략하게 설명합니다.

SDKMANAGER_OPTS를 사용하여 sdkmanager 옵션을 사용할 수 있습니다.

예 :

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

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%


이전 주석에서 읽은 것처럼 현재 SDK 버전이 최신 Java 버전 인 9 및 10과 호환되지 않기 때문에 오류가 발생합니다.

따라서이 문제를 해결하기 위해 Java 버전을 Java 8로 다운 그레이드하거나 해결 방법으로 터미널에서 다음 옵션을 사용할 수 있습니다.

리눅스 :

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

Windows :

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

이 오류를 해결합니다. sdkmanager

그리고 그것은 당신이 리눅스에 프로필 파일에서 JAVA_OPTS를 수출 (수직으로 저장 만들려면 .zshrc, .bashrc등) 또는 Windows에 영구적으로 환경 변수를 추가 할 수 있습니다.


추신. 이 Java EE 모듈이없는 Java 11+에서는 작동하지 않습니다. 이 옵션이 좋은 생각이라면 Java 버전을 다운 그레이드하거나 Flutter 업데이트 기다리세요 .

참조 : JDK 11 : Java EE 모듈의 끝


시스템에 Java 11이있는 경우 솔루션이 유효하지 않습니다.

-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or--add-modules java.xml.bind는 Mac OS의 Java 11에서 작동하지 않습니다.

따라서 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 에서 Java 버전을 버전 8로 다운 그레이드해야합니다

.

평범한 자바 버전

/usr/libexec/java_home -V

자바 11

export JAVA_HOME=$(/usr/libexec/java_home -v 11)

자바 1.8

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

그런 다음

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

./sdkmanager --licenses

Android 도구는 여전히 JDK 9 또는 10과 호환되지 않습니다. JDK 8을 설치하거나 여러 Java 버전이 필요한 경우 시스템 전체 Java 홈이 JDK 8을 도입해야합니다.

자세한 내용은 여기에서 Android를 대상으로하고 OSX에서 빌드 실패를 방지하도록 Unity 2017.4를 구성하는 방법은 무엇입니까?


이 솔루션을 찾는 데 어려움을 겪습니다.

@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

sdkmanager.bat 파일을 사용하여 Android Studio 자체에 포함 된 Java를 강제로 사용하여 문제를 해결합니다. 다음은 내가 가게 편집 된 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 스튜디오에 포함 된 JRE를 포함 된 JRE를 ANDROID_STUDIO_JAVA_HOME 환경 변수를 사용했습니다. 예 : ../android_studio/jre

ANDROID_STUDIO_JAVA_HOME이 설정되지 않은 경우 JAVA_HOME으로 대체됩니다.


승인 된 답변은 2019 년 2 월 현재 구식입니다. 다음sdkmanager 은 최신 버전의 Java로 마이그레이션 할 때까지 작동 하는 답변 입니다 . 그러나 그때까지는 더 이상이 문제가 발생하지 않을 것입니다.

오픈 JDK (10)은 오픈 JDK (11)에 의해 superseeded했다 구현하지 않습니다, java.se.ee 전혀 . 이것은 추가하는 해킹이 --add-modules java.se.ee더 이상 아무것도하지 않는다는 것을 의미합니다 . 또한 업데이트가 올바르게 구성된 경우 OpenJDK 10이 시스템에서 자동으로 제거되고 다음에 업데이트 할 때 OpenJDK 11로 대체됨을 의미합니다.

Java 8 설치 내부sdkmanager설정하여 Java 8을 사용하도록 수정하십시오 . 기본적으로 .JAVA_HOME sdkmanager~/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

이제 수리 파이프 라인 이 몇 개 있습니다.


최신 버전으로 업그레이드하기 전에 android sdk 도구가있는 openJDK 11에 대한 위의 짧은 추가 사항입니다.

위의 솔루션이 저에게 효과적이지 않았습니다.

set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."

이 작업을 수행하기 위해 maven repo에서 jaxb-ri (참조 구현)를 설치했습니다.

이 정보는 주어진 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-Folder의 독립 실행 형 런타임 구현이 포함되어 있습니다.

mod-Folder를 $ 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;

사소한 오류가 나타나서 lib를 놓쳤을 수도 있습니다. 그러나 sdkmanager.bat --update 또는 --list가 현재 실행 중입니다.


https://adoptopenjdk.net은 현재 버전 8부터 모든 JDK 배포를 지원합니다. 예 : https://adoptopenjdk.net/releases.html#x64_win

다음은 sdkmanager 등에서 JDK 버전 8을 사용하는 방법의 예입니다. https://travis-ci.com/mmcc007/screenshots/builds/109365628

JDK 9 (그리고 10 개, 아마도 11 개는 아니지만 12 개 이상은 아님)의 경우 sdkmanager가 작동하도록하려면 다음을 수행해야합니다.

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

나를 위해 작동하는 유일한 솔루션은 Android 스튜디오와 함께 제공되는 Java를 사용하는 것입니다.

JAVA_HOME을 /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

.bashrc

set JAVA_HOME="/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home"

fishshel 을 사용하는 경우 이것을 넣으십시오.~/.config/fish/config.fish

set -gx JAVA_HOME /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

(이것은 Mac 용이지만 올바른 경로를 설정하여 Linux 및 Windows에서 작동해야한다고 확신합니다)


이 오류에 대한 또 다른 해결책은 Java 버전을 확인하는 것입니다.이 jdk oracle-jdk-8을 다운로드하여 해결할 수 있습니다 . 이것은 내 실수였습니다.

참고 URL : https://stackoverflow.com/questions/47150410/failed-to-run-sdkmanager-list-android-sdk-with-java-9

반응형