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

使用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. 执行发布流程

现在可以开始发布了,步骤很简单:

  1. 先发布module-base,确保它已经推送到Sonatype:
    ./gradlew :module-base:publish
    
    Windows用户用gradlew.bat :module-base:publish
  2. 然后发布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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:07:36