2021/10/30

sdkmanager Error : Exception in thread "main" java.lang.NoClassDefFoundError:

從 studio run sdkmanager OK,但是從 command line run sdkmanager 時出現錯誤:
  dkmanager 
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
	at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	... 5 more
一堆人說,用studio 的 sdkmanager 安裝 commandline-tools 之後就好了。
結果裝了還是一樣 的錯。

後來發現...
裝了 cmdline-tools 後,裡面也有一個 sdkmanager, run 這個 sdkmanager 就不會有 error 了。
這兩個 sdkmanager 都是 shell script,所以來diff 一下...
cmdline-tools/latest/bin$ diff sdkmanager ../../../tools/bin/sdkmanager 
5c5
< ##  sdkmanager start up script for Linux
---
> ##  sdkmanager start up script for UN*X
31c31
< DEFAULT_JVM_OPTS='-Dcom.android.sdklib.toolsdir=$APP_HOME'
---
> DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
67c67
< CLASSPATH=$APP_HOME/lib/sdkmanager-classpath.jar
---
> 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
果然就是 classpath,猜是 tools/bin 是給 studio 用的,它已經default 有一些 jar 了。
cmdline-tools 的才是給 command line 用的。


其實這是要 Accept Android SDK/tool licenses 時遇到的。
用 sdkmanager --licenses 來 accept 所有 license。
accept 之後,會在 Android/Sdk/License 中出現很多 license 檔。

沒有留言:

張貼留言