基于Ionic Angular构建Ark时Bitbucket Pipeline Java编译报错求助
看起来你在Bitbucket Pipelines上构建Ionic Angular的Android应用时,碰到了Java编译失败的问题——那些找不到org.json、android.annotation这类包的错误,本质都是Android SDK的依赖没被正确引入到编译流程里。我帮你梳理下问题根源,再给你一套可直接复用的修复脚本。
问题回顾
你用的是node:10.14.1镜像,执行ionic cordova build android时出现如下编译错误:
/opt/atlassian/pipelines/agent/build/platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java:22: error: package org.json does not exist
import org.json.JSONException;
^
/opt/atlassian/pipelines/agent/build/platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java:28: error: cannot find symbol
public String exec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException;
^
symbol: class JSONException
location: interface ExposedJsApi
/opt/atlassian/pipelines/agent/build/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java:25: error: package android.annotation does not exist
import android.annotation.SuppressLint;
^
/opt/atlassian/pipelines/agent/build/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java:26: error: package android.webkit does not exist
import android.webkit.ClientCertRequest;
^
问题根源
你的构建脚本存在几个关键问题:
- 使用了旧版Android SDK工具包,和新的Cordova Android版本不兼容
- Android SDK的目录结构配置不对,导致Gradle找不到依赖库
- Gradle版本和你项目里的Cordova Android版本不匹配
- 环境变量配置不全,缺少新版SDK要求的
ANDROID_SDK_ROOT
修复方案
直接替换你的Pipelines脚本,下面是调整后的完整版本,我会标注关键修改点:
image: node:10.14.1 pipelines: default: - step: name: Build Android App script: # 安装Ionic和Cordova - npm install -g ionic cordova # 安装项目依赖 - npm install # 安装系统依赖:替换成openjdk-8-jdk-headless,避免oracle-java8的安装问题 - apt-get update && apt-get install -y --no-install-recommends zip unzip openjdk-8-jdk-headless # 下载新版Android命令行工具(替代旧版sdk-tools) - wget https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip -P /tmp - unzip -q /tmp/commandlinetools-linux-6858069_latest.zip -d android-sdk # 调整SDK目录结构,符合Google最新要求 - mkdir -p android-sdk/cmdline-tools/latest - mv android-sdk/cmdline-tools/* android-sdk/cmdline-tools/latest/ # 自动接受所有SDK许可协议,避免构建中断 - yes | android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses # 安装对应版本的SDK组件:这里适配cordova-android@8.x,若你用其他版本请调整 - android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-28" "build-tools;28.0.3" # 下载适配的Gradle版本:cordova-android@8.x对应gradle-4.10.3 - wget https://services.gradle.org/distributions/gradle-4.10.3-bin.zip -P /tmp - unzip -q /tmp/gradle-4.10.3-bin.zip -d /opt/gradle # 完善环境变量配置,新增ANDROID_SDK_ROOT - export ANDROID_HOME=$PWD/android-sdk - export ANDROID_SDK_ROOT=$ANDROID_HOME - export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/28.0.3 - export GRADLE_HOME=/opt/gradle/gradle-4.10.3 - export PATH=$PATH:$GRADLE_HOME/bin # 验证配置是否正确 - java -version - gradle --version - sdkmanager --list | grep -E "platforms;android-28|build-tools;28.0.3" # 构建应用(建议加--release --prod参数,生成正式包) - ionic cordova build android --release --prod
关键修改说明
- 替换SDK工具:旧版
sdk-tools已经被Google弃用,改用新版commandlinetools避免兼容性问题 - 目录结构调整:新版SDK要求
cmdline-tools放在latest子目录下,否则sdkmanager无法正常工作 - 许可协议自动接受:新增
yes | sdkmanager --licenses,避免构建时卡在手动确认步骤 - 版本匹配:
- 如果你项目用的是
cordova-android@9.x,需要安装android-29和build-tools;29.0.2,Gradle用5.6.4 - 如果你用
cordova-android@10.x,对应android-30、build-tools;30.0.3,Gradle用6.7.1
- 如果你项目用的是
- 环境变量补全:添加
ANDROID_SDK_ROOT,这是新版Android SDK必须的环境变量
额外检查
- 先在本地执行
ionic cordova platform ls,查看你当前的cordova-android版本,确保脚本里的SDK和Gradle版本和它匹配 - 检查项目
config.xml里的android-targetSdkVersion,要和你安装的android-xx版本一致 - 如果还是报错,试试删除本地的
platforms/android和plugins目录,重新执行ionic cordova platform add android后再推送代码构建
内容的提问来源于stack exchange,提问作者Sunny

