Bitbucket Pipelines中Flutter构建JVM版本兼容问题解决方案
解决Bitbucket Pipelines中Flutter构建的JVM版本不兼容问题
问题描述
Bitbucket Pipelines执行Flutter构建脚本时触发如下错误:
What went wrong: Execution failed for task ':paytm_allinonesdk:compileReleaseKotlin'. 'compileReleaseJavaWithJavac' task (current target is 1.8) and 'compileReleaseKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version. Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain
本地通过修改pub缓存临时解决了问题,但Pipelines每次构建都会重新下载pub缓存,导致问题反复出现。当前使用的Docker镜像配置如下:
# Use an official Flutter image as the base FROM maven:3.3.9 FROM ghcr.io/cirruslabs/android-sdk:34 RUN apt-get update -y RUN apt-get install -y \ curl \ wget \ git \ iputils-ping \ unzip \ xz-utils && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Download and install SonarScanner CLI RUN curl -o /tmp/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-6.1.0.4477-linux-x64.zip && \ unzip /tmp/sonar-scanner.zip -d /opt && \ rm /tmp/sonar-scanner.zip # Set up SonarScanner environment variables ENV SONAR_SCANNER_HOME=/opt/sonar-scanner-6.1.0.4477-linux-x64 ENV PATH="$SONAR_SCANNER_HOME/bin:$PATH" # Download and install Flutter SDK RUN wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.24.0-stable.tar.xz -O /opt/flutter_3.24.0.tar.xz RUN tar -xf /opt/flutter_3.24.0.tar.xz -C /opt/ RUN rm -f /opt/flutter_3.24.0.tar.xz # Set up environment variables for Flutter ENV FLUTTER_HOME=/opt/flutter ENV PATH="$FLUTTER_HOME/bin:$PATH" RUN git config --global --add safe.directory /opt/flutter # Ensure Flutter dependencies are installed RUN flutter doctor # Set working directory for the app WORKDIR /app # Copy the project files into the container COPY . /app
解决方案
1. 统一项目JVM编译目标版本(核心解决方法)
问题根源是第三方依赖paytm_allinonesdk用JVM 17编译,而项目Java编译目标是1.8,版本不匹配。直接修改项目Gradle配置,强制所有模块使用同一版本:
方式一:修改根目录android/build.gradle
在文件中添加全局配置,覆盖所有模块的编译版本:
buildscript { ext { // 统一设置为17,和依赖的Kotlin目标版本匹配 jvmTarget = '17' } // 保留原有其他配置 } allprojects { repositories { // 保留原有仓库配置 } // 统一配置所有Kotlin编译任务的JVM目标 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { jvmTarget = rootProject.ext.jvmTarget } } // 统一配置所有Java编译任务的目标版本 tasks.withType(JavaCompile).configureEach { sourceCompatibility = rootProject.ext.jvmTarget targetCompatibility = rootProject.ext.jvmTarget } }
方式二:修改app模块android/app/build.gradle
如果只需要针对主app模块调整,在android块内添加:
android { // 保留原有compileSdkVersion、defaultConfig等配置 compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = '17' } }
提示:不建议改成1.8,因为依赖本身是用17编译的,强行降级可能引发其他兼容性问题。
2. 确保Docker镜像支持对应Java版本
当前使用的ghcr.io/cirruslabs/android-sdk:34可能默认只有Java 8,需要在Dockerfile中添加Java 17的安装步骤:
# 在apt-get install之后添加 RUN apt-get install -y openjdk-17-jdk # 设置默认Java版本为17 RUN update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java RUN update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac
3. 可选:配置Pipelines缓存pub依赖
如果不想每次构建都重新下载依赖,可以在bitbucket-pipelines.yml中添加缓存规则:
pipelines: default: - step: caches: - flutter script: - flutter pub get - flutter build apk definitions: caches: flutter: $HOME/.pub-cache
内容的提问来源于stack exchange,提问作者Razer
相关产品推荐
相关产品推荐

