Android SDK 도구를 설치할 때 다음 오류가 발생합니다.
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)
답변
오늘 아침에도 비슷한 문제가 발생했습니다 (Unity3D를 사용하여 Android 용 빌드하려고합니다). JDK9를 제거하고 Java SE Development Kit 8u144를 설치 했습니다 . 도움이 되었기를 바랍니다.
brew cask uninstall java
# java9 제거brew tap homebrew/cask-versions
brew cask install java8
# java8 설치touch ~/.android/repositories.cfg
#이 파일이 없으면 다음 단계에서 오류가 발생합니다brew cask install android-sdk
답변
이 오류를 해결하기 위해 Java 버전을 다운 그레이드 할 수 있습니다.
또는 터미널에서 다음 옵션을 내 보냅니다.
리눅스 / MAC :
export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
윈도우 :
set JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
그리고 당신은 수출이 수 영구적으로 저장 JAVA_OPTS
(리눅스에서 내 프로필 파일 .zshrc
, .bashrc
등 등) 또는 Windows 영구적으로 환경 변수로 추가 할 수 있습니다.
추신. Java EE 모듈이없는 Java 11+에서는 작동하지 않습니다. 이 옵션을 사용하는 것이 좋습니다. Java 버전을 다운 그레이드하거나 Flutter 업데이트를 기다리십시오 .
답변
set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
이것은 Windows의 문제를 해결했습니다.
답변
Java 버전을 변경하지 않으려는 경우 (필요하지 않음) 쉘에서 일시적으로 버전을 변경할 수 있습니다.
첫 실행
/usr/libexec/java_home -V
그런 다음 설치 한 메이저 버전을 선택하십시오. 그렇지 않으면 먼저 설치하십시오.
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
이제 sdkmanager를 실행할 수 있습니다.
답변
Mac / Linux에서는 다음 명령을 사용하십시오.
export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
스크립트 (sdkmanager, avdmanager) 를 패치하지 않고 JDK 9와 10 모두에서 작동합니다 .
Java 11의 경우 https://stackoverflow.com/a/51644855/798165를 참조하십시오.
답변
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을 사용할 수 있습니다.
세부 사항은 그의 게시물에 있습니다.
답변
프로파일에 다음을 추가해야합니다 (MacOS에서 작동).
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
아무것도 패치 할 필요가 없습니다.