多版本Java环境下Android SDK工具运行异常的解决咨询
解决Arch Linux下Android SDK工具Java版本兼容问题
问题背景
我的Arch Linux笔记本上安装了OracleJDK 8、9和10版本。使用Java 9或10运行avdmanager时出现如下错误:
% avdmanager list device :( 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.AvdManagerCli.run(AvdManagerCli.java:213) at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200) 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:190) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) ... 5 more
但在Java 8环境下avdmanager可正常运行;然而此时sdkmanager等其他SDK工具又无法运行,报错如下:
% sdkmanager --update Error: Could not find or load main class java.se.ee
使用的是Android SDK 26.1.1,该如何解决这一问题?
问题分析
这个冲突的核心是旧版Android SDK工具(26.1.1)对Java版本的兼容性适配不足:
- Java 9及以后的版本移除了
javax.xml.bind相关的JAXB模块,而avdmanager依赖这个模块,直接运行就会触发NoClassDefFoundError; - 但
sdkmanager在Java 8环境下无法识别java.se.ee模块,导致启动失败。
可行解决方案
针对Arch Linux环境,这里提供两种实用的解决方法:
方法一:修改avdmanager脚本添加兼容参数
直接给avdmanager的启动命令加上Java 9+需要的模块引入参数,这样就能在Java 9/10环境下正常运行它,同时sdkmanager也能正常工作:
- 找到
avdmanager的脚本文件,通常路径是$ANDROID_SDK_ROOT/tools/bin/avdmanager(替换成你实际的SDK根目录); - 打开脚本,找到执行Java命令的行,类似:
exec "$JAVACMD" $JAVA_OPTS "$@" - 修改为:
exec "$JAVACMD" $JAVA_OPTS --add-modules java.xml.bind "$@"
保存后,你就可以用Java 9/10同时正常运行avdmanager和sdkmanager了。
方法二:利用archlinux-java切换Java版本适配不同工具
Arch Linux自带的archlinux-java工具可以快速切换系统默认Java版本,分别适配不同的SDK工具:
- 运行
avdmanager时,切换到Java 8:sudo archlinux-java set java-8-oracle avdmanager list device - 运行
sdkmanager时,切换回Java 9或10:sudo archlinux-java set java-9-oracle # 或者java-10-oracle,根据你安装的版本选择 sdkmanager --update
这种方法不需要修改任何脚本,缺点是每次切换工具都需要手动执行版本切换命令。
额外建议
如果条件允许,升级你的Android SDK工具到26.1.1之后的版本(比如28.0.3及以上),新版工具已经完全适配了Java 9+的环境,不需要任何额外调整就能正常运行所有SDK工具,这是最一劳永逸的解决方式。
内容的提问来源于stack exchange,提问作者orayan
相关产品推荐
相关产品推荐

