能否定义公共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
相关产品推荐
相关产品推荐

