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

能否定义公共Gradle publish任务 避免多子模块重复拷贝配置

解决方案

完全可以将publish逻辑抽取为公共配置,仅需在子模块传入自定义参数即可使用,无需重复拷贝代码,推荐以下最便捷的实现方式:


步骤1:修改根项目build.gradle配置

在根目录的build.gradle中添加公共逻辑,自动识别需要发布的子模块并加载publish配置:

// 根项目统一配置公共属性,也可放到gradle.properties中更安全
ext {
    dabaiSnapshotRepo = "你的快照仓库地址"
    dabaiReleaseRepo = "你的正式仓库地址"
    mavenLoginName = "仓库用户名"
    mavenPassword = "仓库密码"
    // 如果所有子模块groupId统一,可直接在此处声明统一groupId,子模块无需重复传参
    // globalPublishGroupId = "com.sportswin.soa"
}

// 遍历所有子模块
subprojects { sub ->
    sub.afterEvaluate { project ->
        // 仅当子模块配置了发布相关参数才加载publish逻辑,不需要发布的子模块不受影响
        if (project.hasProperty('publishGroupId') && project.hasProperty('publishArtifactId') && project.hasProperty('publishVersion')) {
            // 自动应用maven发布插件
            apply plugin: 'maven-publish'
            
            // 公共源码包生成任务
            task sourceJar(type: Jar) {
                classifier = 'sources'
                from sourceSets.main.allJava
            }

            // 公共publish核心配置
            publishing {
                publications {
                    maven(MavenPublication) {
                        groupId project.publishGroupId
                        // 如果groupId统一,直接用上面的全局配置即可,替换为下面的写法
                        // groupId globalPublishGroupId
                        artifactId project.publishArtifactId
                        version project.publishVersion

                        from components.java
                        artifact sourceJar
                    }
                }
                repositories {
                    maven {
                        url = project.publishVersion.endsWith('SNAPSHOT') ? dabaiSnapshotRepo : dabaiReleaseRepo
                        credentials {
                            username mavenLoginName
                            password mavenPassword
                        }
                    }
                }
            }
        }
    }
}

步骤2:子模块仅需配置自定义参数

原来子模块build.gradle里的全部publishing配置都可以删掉,仅需加3行参数配置即可,以soa-auth-api为例:

// 仅需添加这3行发布参数即可,其余原有配置(jar、bootJar、依赖等)完全保留
ext {
    publishGroupId = 'com.sportswin.soa'
    publishArtifactId = 'soa-auth-api'
    publishVersion = '1.0.0-SNAPSHOT'
}

jar {
    enabled = true
}

bootJar {
    enabled = false
}

dependencies {
    api project(":soa-misc-biz")
}

不需要发布的子模块(比如可执行的service模块)不需要加任何配置,不会生成publish任务,完全不影响原有逻辑。


注意事项
  • 使用afterEvaluate是为了确保子模块的Java插件、自定义属性已经加载完成,避免Gradle7+版本报components.java找不到的错误
  • 仓库的用户名、密码建议放到gradle.properties文件中管理,不要硬编码在构建脚本里,安全性更高
  • 如果所有子模块的groupId完全一致,可直接在根配置中写死groupId,子模块仅需传artifactId和version两个参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:15:04