Ionic Cordova构建Android时JDK版本兼容问题求助
使用ionic cordova build android生成Android构建包时遇到以下问题:
当前环境配置
- gradle 7.4.2
- cordova-android 10.1.2
- jdk 11.0.19
- SDK 31及build-tools 31.0.0(已从30.0.3复制dx和dx.jar)
具体故障
- 执行
ionic cordova requirements时触发错误:
Requirements check results for android:
Java JDK: installed 11.0.19
Android SDK: installed true
Android target: not installed
Command failed with exit code 1: avdmanager list target
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.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:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 5 more
Gradle: installed /opt/gradle/gradle-7.4.2/bin/gradle
- 切换至JDK8时,
ionic cordova requirements检测正常,但构建SDK31版本会缺失依赖库;直接执行gradle bundleRelease可成功构建SDK31的签名APK并正常运行,然而ionic cordova build android仍无法正常工作。
1. 修复JDK11下Avdmanager的依赖缺失问题
JDK11移除了javax.xml.bind相关包,旧版Avdmanager依赖该包,可通过以下两种方式解决:
修改Avdmanager启动脚本
找到SDK目录下的tools/bin/avdmanager脚本,修改DEFAULT_JVM_OPTS行,添加JAXB适配参数:DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" "-XX:+IgnoreUnrecognizedVMOptions" "--add-modules=java.se.ee" "--add-opens=java.base/java.lang=ALL-UNNAMED" "--add-opens=java.base/java.io=ALL-UNNAMED" "--add-opens=java.base/java.util=ALL-UNNAMED" "--add-opens=java.base/java.util.concurrent=ALL-UNNAMED" "--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"'Windows系统则修改
avdmanager.bat中的set DEFAULT_JVM_OPTS部分,添加相同参数。升级SDK命令行工具
弃用旧的tools目录工具,改用ANDROID_SDK_ROOT/cmdline-tools/latest/bin下的新版本工具,将该路径加入PATH替换原tools/bin。新版本cmdline-tools已适配JDK11,不会出现JAXB缺失问题。
2. 调整Cordova构建配置适配JDK11+SDK31
虽然直接用gradle bundleRelease可成功,但需调整Cordova的构建脚本:
修改项目gradle配置
打开项目platforms/android/build.gradle文件,添加以下配置:android { compileSdkVersion 31 buildToolsVersion "31.0.0" defaultConfig { targetSdkVersion 31 } compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } } dependencies { implementation 'javax.xml.bind:jaxb-api:2.3.1' implementation 'com.sun.xml.bind:jaxb-core:2.3.0.1' implementation 'com.sun.xml.bind:jaxb-impl:2.3.2' }校验环境变量
确保JAVA_HOME指向JDK11,ANDROID_SDK_ROOT路径正确,PATH包含cmdline-tools/latest/bin、platform-tools、gradle/bin。
3. 老旧项目兼容替代方案
若上述修改仍有问题,可尝试:
- 分环境切换JDK:用JDK8执行
ionic cordova requirements检测,构建前临时切换至JDK11:export JAVA_HOME=/path/to/jdk11 && ionic cordova build android --release - 升级cordova-android至11.x版本,新版本对JDK11和SDK31兼容性更好,但需确认老旧插件是否适配。
内容的提问来源于stack exchange,提问作者David MOSCA

