You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:50:58