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

Gradle多项目构建:按环境排除编译步骤的实现方法

实现本地编译/QA环境拉取远程JAR的Gradle构建方案

你可以通过环境开关+依赖切换的方式实现需求:本地环境默认编译子项目,QA环境通过参数/环境变量触发,直接从Artifactory拉取已发布的子项目JAR包,跳过本地编译步骤。以下是具体配置:


1. 定义环境识别开关

在根项目的build.gradle开头添加环境判断逻辑,通过命令行参数或环境变量区分QA环境:

// 识别QA构建模式:支持两种触发方式
// 方式1:命令行传参 ./gradlew build -PqaBuild=true
// 方式2:设置环境变量 QA_BUILD=1 ./gradlew build
def isQaBuild = project.hasProperty('qaBuild') ? project.property('qaBuild').toBoolean() : 
                System.getenv('QA_BUILD')?.toBoolean() ?: false

2. 配置子项目任务开关

在根项目的subprojects块中,添加QA模式下的任务禁用逻辑,跳过编译、测试、打包等本地构建任务:

subprojects {
    task allDeps(type: DependencyReportTask) {}

    if (isQaBuild) {
        // QA模式下禁用所有编译、测试、打包任务
        tasks.withType(JavaCompile) { enabled = false }
        tasks.withType(Test) { enabled = false }
        tasks.withType(Jar) { enabled = false }
        // 清空子项目build任务的依赖,避免执行多余操作
        build.dependsOn = []
    }
}

3. 切换依赖来源

根据环境开关,选择依赖本地子项目(本地模式)或Artifactory远程JAR(QA模式):

// 统一管理版本号,确保和Artifactory上发布的子项目版本一致
def subProjectVersion = "1.0.0"

dependencies {
    // 公共运行时依赖保持不变
    runtimeOnly "com.partygaming.thirdparty:aopalliance:1.0"
    runtimeOnly "com.partygaming.thirdparty:spring-aop:5.3.22"
    runtimeOnly "com.partygaming.thirdparty:spring-tx:5.3.22"
    runtimeOnly "com.partygaming.thirdparty:spring-expression:5.3.22"
    runtimeOnly "com.partygaming.thirdparty:osgi.core:8.0.0"
    
    runtimeOnly "com.partygaming.thirdparty:disruptor:3.4.4"
    runtimeOnly "com.partygaming.thirdparty:commons-beanutils:1.9.4"
    runtimeOnly "com.partygaming.thirdparty:commons-io:2.11.0"
    runtimeOnly "com.partygaming.thirdparty:commons-logging:1.2"
    runtimeOnly "com.partygaming.thirdparty:guava:31.1-jre"
    runtimeOnly "com.partygaming.thirdparty:jakarta.activation-api:1.2.2"
    runtimeOnly "com.partygaming.thirdparty:objenesis:3.3"
    runtimeOnly "com.partygaming.thirdparty:jakarta.xml.bind-api:2.3.3"
    runtimeOnly "com.partygaming.thirdparty:jaxb-impl:2.3.6"

    if (!isQaBuild) {
        // 本地模式:依赖本地子项目
        runtimeOnly project(':abc-api')
        runtimeOnly project(':xyz-api')
        runtimeOnly project(':abc-impl')
        runtimeOnly project(':xyz-impl')
    } else {
        // QA模式:从Artifactory拉取已发布的子项目JAR
        runtimeOnly "com.yourcompany:abc-api:${subProjectVersion}"
        runtimeOnly "com.yourcompany:xyz-api:${subProjectVersion}"
        runtimeOnly "com.yourcompany:abc-impl:${subProjectVersion}"
        runtimeOnly "com.yourcompany:xyz-impl:${subProjectVersion}"
    }
}

4. 调整依赖收集任务

修改getFlatDependencies任务,QA模式下直接从远程依赖收集JAR,无需读取本地子项目的classpath:

task getFlatDependencies(type: Copy) {
    if (!isQaBuild) {
        // 本地模式:从子项目编译/运行时classpath收集依赖
        from {
            subprojects.findAll { it.subprojects.isEmpty() }
                        .collect { it.configurations.runtimeClasspath + it.configurations.compileClasspath }
        }
    }
    // 公共运行时依赖两种模式都需要收集
    from configurations.runtimeClasspath
    into 'lib'
    exclude "sourceanalyzer-1.0.jar"
}

build.dependsOn(getFlatDependencies)

5. 配置Artifactory仓库(若未配置)

在根项目build.gradle中添加Artifactory仓库地址及认证信息:

repositories {
    mavenLocal()
    maven {
        url = uri("https://your-artifactory-url/repository/maven-releases/")
        // 通过环境变量传递认证信息,避免硬编码
        credentials {
            username = System.getenv('ARTIFACTORY_USER')
            password = System.getenv('ARTIFACTORY_PWD')
        }
    }
}

使用方式

  • 本地构建(编译子项目):直接执行默认命令
./gradlew build
  • QA环境构建(拉取远程JAR):通过参数或环境变量触发
# 方式1:命令行传参
./gradlew build -PqaBuild=true

# 方式2:设置环境变量
export QA_BUILD=1
./gradlew build

内容的提问来源于stack exchange,提问作者kaluva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:20:37