
1. 问题描述
在cordova项目开发中,当开发者尝试使用cordova build命令构建android应用时,可能会遇到一系列构建错误,尤其是在使用较新版本的java开发工具包(jdk),例如java 19时。常见的错误包括:
-
cordova requirements 命令失败: 在执行cordova requirements检查环境时,可能出现Command failed with exit code 1: avdmanager list target,并伴随java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema的错误信息。这表明Android SDK工具在当前Java环境下无法正常运行。
C:\Users\NAME\Desktop\TestProject>cordova requirements Requirements check results for android: Java JDK: installed 19.0.1 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) ... Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema ... Some of requirements check failed -
cordova build 命令失败: 在执行cordova build时,构建过程会因为Gradle的编译问题而终止,报错信息通常为“FAILURE: Build failed with an exception.”,并指出“Could not compile settings file”以及“Unsupported class file major version 63”。
C:\Users\NAME\Desktop\TestProject>cordova build ... FAILURE: Build failed with an exception. * Where: Settings file 'C:\Users\NAME\Desktop\TestProject\platforms\android\settings.gradle' * What went wrong: Could not compile settings file 'C:\Users\NAME\Desktop\TestProject\platforms\android\settings.gradle'. > startup failed: General error during semantic analysis: Unsupported class file major version 63
这些错误通常发生在以下配置环境中:
- Java Version: 19.0.1
- Cordova Version: 11.0.0
- NPM Version: 7.15.0
- Gradle Version: 6.9.3
2. 原因分析
问题的核心在于Java版本与Cordova、Gradle以及Android SDK工具链之间的兼容性。
- Unsupported class file major version 63: 这个错误信息直接指明了问题所在。Java类文件有一个主版本号,用于标识编译该文件的JDK版本。主版本号63对应的是Java 19。当Gradle或其依赖的某个组件(特别是Android Gradle Plugin)是用较低版本的Java(如Java 8或Java 11)编译的,并且尝试加载由Java 19编译的类文件时,就会出现这个错误,因为它无法识别更高版本的类文件格式。反之,如果Gradle或Android Gradle Plugin本身不支持在Java 19环境下运行,也会导致编译失败。
- java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema: 这个错误与Java SE模块化有关。从Java 9开始,javax.xml.bind包(JAXB API)被移除了Java SE的默认类路径,成为一个独立的模块。Java 8及之前的版本默认包含JAXB。Android SDK的一些旧工具(如avdmanager)可能仍然依赖JAXB,但在Java 9及更高版本中,如果未明确添加JAXB模块,就会出现NoClassDefFoundError。
综合来看,Cordova 11.0.0及其依赖的Android平台工具和Gradle版本在设计时可能并未完全兼容Java 19。
3. 解决方案:降级Java版本至JDK 11
解决上述问题的最直接且有效的方法是将Java开发工具包(JDK)降级到与Cordova及其依赖工具链更兼容的版本,通常是JDK 11。Cordova官方文档也推荐使用特定版本的JDK。
立即学习“Java免费学习笔记(深入)”;
3.1 检查当前Java版本
在执行降级操作之前,首先确认当前系统正在使用的Java版本。 打开命令行或终端,输入:
java -version
如果输出显示Java版本为19.x.x,则需要进行降级。
3.2 安装JDK 11
从官方渠道下载并安装JDK 11。推荐的下载源包括:
- Adoptium (Eclipse Temurin):提供免费、开放源代码的JDK构建。 访问 Adoptium官网,选择JDK 11版本进行下载。
- Oracle JDK:需要Oracle账号并同意许可协议。 访问 Oracle JDK下载页面,选择Java 11版本。
根据您的操作系统(Windows, macOS, Linux)选择相应的安装包并进行安装。
3.3 配置环境变量 JAVA_HOME
安装JDK 11后,需要确保系统正确指向新安装的Java版本。这通常通过设置或修改JAVA_HOME环境变量来实现。
Windows 系统:
- 右键点击“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
- 在“系统变量”下,查找JAVA_HOME变量。如果存在,编辑它;如果不存在,新建一个。
- 将JAVA_HOME的值设置为JDK 11的安装路径,例如:C:\Program Files\Java\jdk-11.0.x。
- 在Path变量中,确保 %JAVA_HOME%\bin 位于其他Java路径之前,或者移除旧的Java路径。
- 点击“确定”保存更改。
- 打开一个新的命令行窗口(旧的窗口可能不会立即生效),再次运行java -version确认版本已更新。
macOS / Linux 系统:
- 打开终端。
- 编辑您的shell配置文件(例如 ~/.bashrc, ~/.zshrc, ~/.profile)。
nano ~/.zshrc # 或 ~/.bashrc
- 添加或修改以下行,将/path/to/jdk-11.0.x替换为您的JDK 11实际安装路径:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.x.jdk/Contents/Home # macOS 示例 # 或者 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # Linux 示例 export PATH=$JAVA_HOME/bin:$PATH
- 保存文件并退出编辑器。
- 在终端中执行以下命令使更改生效:
source ~/.zshrc # 或 source ~/.bashrc
- 运行java -version确认版本已更新。
4. 验证解决方案
完成Java版本降级和环境变量配置后,返回到您的Cordova项目目录,重新运行cordova requirements和cordova build命令。
-
检查环境要求:
cordova requirements
此时,Java JDK应该显示为installed 11.x.x,并且Android target相关的错误应该消失。
-
重新构建项目:
cordova build android
如果一切顺利,项目应该能够成功构建,不再出现“Unsupported class file major version 63”或NoClassDefFoundError等错误。
5. 注意事项与最佳实践
- Cordova官方文档: 始终查阅您所使用的Cordova版本对应的官方文档,了解其推荐的JDK、Gradle和Android SDK版本。这能有效避免兼容性问题。
-
多Java版本管理: 如果您的开发环境需要同时使用多个Java版本(例如,不同的项目依赖不同的JDK),可以考虑使用Java版本管理工具,如:
- SDKMAN! (Linux/macOS):一个强大的命令行工具,用于管理多个SDK版本,包括Java、Gradle等。
- jEnv (macOS/Linux):另一个Java版本管理工具。
- 手动切换环境变量 (Windows):通过批处理脚本或修改系统环境变量来切换JAVA_HOME。
- Gradle版本: 确保Cordova项目使用的Gradle版本也与JDK 11兼容。通常,Cordova会自动配置合适的Gradle版本,但如果手动修改过,需确保兼容性。
- Android SDK Tools: 保持Android SDK Tools为最新版本,但要注意其与JDK的兼容性。在大多数情况下,JDK 11是当前Cordova Android平台广泛支持的版本。
通过遵循上述步骤和最佳实践,您可以有效地解决Cordova构建过程中因Java版本不兼容而导致的错误,确保开发流程的顺畅。










