使用maven-publish发布module-to-publish至MavenCentral时,如何包含module-base子模块依赖?
Hey,我来帮你一步步搞定这个发布配置,确保module-to-publish能顺利推送到MavenCentral,同时正确关联module-base作为依赖项:
1. 先搞定基础准备工作
在开始配置之前,你得先完成这两个必要操作:
- 注册Sonatype账号,并且完成域名验证(如果你的groupId是自定义域名的话,需要验证所有权)
- 生成GPG密钥对,把公钥上传到公共密钥服务器(比如keys.openpgp.org),这样MavenCentral才能验证你的发布签名
2. 配置项目根目录的构建脚本
不管你用Groovy还是Kotlin DSL,先在根目录的build.gradle(或build.gradle.kts)里统一引入发布和签名插件,并且配置仓库:
Groovy 版本
plugins { id 'maven-publish' apply false id 'signing' apply false } allprojects { repositories { mavenCentral() } }
Kotlin DSL 版本
plugins { `maven-publish` apply false signing apply false } allprojects { repositories { mavenCentral() } }
3. 配置
module-base的发布信息 因为module-to-publish依赖它,所以module-base也需要被正确发布(或者至少配置好Maven坐标,这样生成的POM文件才能正确引用)。打开module-base的build.gradle:
plugins { id 'java' // 如果是Android库模块,替换成 id 'com.android.library' id 'maven-publish' id 'signing' } // 替换成你的Maven坐标信息 group = 'com.your.company' version = '1.0.0' def artifactId = 'module-base' publishing { publications { // Android模块的话,把components.java换成components.release mavenJava(MavenPublication) { groupId = project.group artifactId = artifactId version = project.version from components.java // 配置POM文件的元信息,这部分是MavenCentral要求的 pom { name = 'Module Base' description = '基础工具模块' url = 'https://github.com/your-username/your-repo' licenses { license { name = 'The Apache License, Version 2.0' url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { developer { id = 'your-github-id' name = 'Your Name' email = 'your-email@example.com' } } scm { connection = 'scm:git:git://github.com/your-username/your-repo.git' developerConnection = 'scm:git:ssh://github.com/your-username/your-repo.git' url = 'https://github.com/your-username/your-repo' } } } } // 配置Sonatype的发布仓库 repositories { maven { def repoUrl = version.endsWith('-SNAPSHOT') ? 'https://s01.oss.sonatype.org/content/repositories/snapshots/' : 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/' url = uri(repoUrl) credentials { // 建议用环境变量或gradle.properties存敏感信息,不要硬编码 username = System.getenv('SONATYPE_USERNAME') ?: project.property('sonatypeUsername') password = System.getenv('SONATYPE_PASSWORD') ?: project.property('sonatypePassword') } } } } // 配置GPG签名 signing { sign publishing.publications.mavenJava }
4. 配置
module-to-publish的发布信息 接下来处理要发布的模块,它需要依赖module-base,同时配置自己的发布信息:
plugins { id 'java' // Android模块替换成 id 'com.android.library' id 'maven-publish' id 'signing' } group = 'com.your.company' // 和module-base保持一致的groupId version = '1.0.0' def artifactId = 'module-to-publish' dependencies { // 依赖本地的module-base,发布时会自动替换成Maven坐标 implementation project(':module-base') } publishing { publications { mavenJava(MavenPublication) { groupId = project.group artifactId = artifactId version = project.version from components.java // Android用components.release pom { name = 'Module to Publish' description = '业务功能模块' url = 'https://github.com/your-username/your-repo' licenses { license { name = 'The Apache License, Version 2.0' url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' } } developers { developer { id = 'your-github-id' name = 'Your Name' email = 'your-email@example.com' } } scm { connection = 'scm:git:git://github.com/your-username/your-repo.git' developerConnection = 'scm:git:ssh://github.com/your-username/your-repo.git' url = 'https://github.com/your-username/your-repo' } } } } repositories { maven { def repoUrl = version.endsWith('-SNAPSHOT') ? 'https://s01.oss.sonatype.org/content/repositories/snapshots/' : 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/' url = uri(repoUrl) credentials { username = System.getenv('SONATYPE_USERNAME') ?: project.property('sonatypeUsername') password = System.getenv('SONATYPE_PASSWORD') ?: project.property('sonatypePassword') } } } } signing { sign publishing.publications.mavenJava }
5. 执行发布流程
现在可以开始发布了,步骤很简单:
- 先发布
module-base,确保它已经推送到Sonatype:
Windows用户用./gradlew :module-base:publishgradlew.bat :module-base:publish - 然后发布
module-to-publish:./gradlew :module-to-publish:publish
正式版本的后续操作
如果发布的是正式版本(不带-SNAPSHOT后缀),你需要登录Sonatype Nexus控制台:
- 找到对应的staging仓库,点击
Close完成验证 - 验证通过后点击
Release,等待几个小时到一天,版本就会同步到MavenCentral
快照版本
如果是快照版本,发布后会直接推送到Sonatype的快照仓库,不需要额外操作,其他用户可以直接通过快照仓库地址拉取。
一些关键注意事项
- 敏感信息不要硬编码:建议把Sonatype账号密码、GPG密钥信息存在
~/.gradle/gradle.properties里,比如:sonatypeUsername=your-sonatype-email sonatypePassword=your-sonatype-password signing.keyId=your-gpg-key-id signing.password=your-gpg-passphrase signing.secretKeyRingFile=~/.gnupg/secring.gpg - Android模块额外配置:如果是Android库,要确保
build.gradle里的android块开启了发布组件,新版本AGP默认已经支持,不需要额外配置,但旧版本可能需要加publishNonDefault = true - 坐标一致性:
module-base和module-to-publish的groupId尽量保持一致,版本号可以根据需求调整,但要确保依赖的版本和发布的版本匹配
内容的提问来源于stack exchange,提问作者boybeak
相关产品推荐
相关产品推荐

