Skip to content

发布库到 Maven Central

前提条件

  1. issues.sonatype.org 注册账号并申请 groupId
  2. 生成 GPG 密钥对
bash
# 生成 GPG 密钥
gpg --gen-key

# 查看密钥
gpg --list-keys

# 上传公钥到服务器
gpg --keyserver keyserver.ubuntu.com --send-keys YOUR_KEY_ID

# 导出密钥(用于 CI)
gpg --export-secret-keys YOUR_KEY_ID | base64

build.gradle.kts

kotlin
plugins {
    `java-library`
    `maven-publish`
    signing
}

group = "com.example"
version = "1.0.0"

java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
    withSourcesJar()
    withJavadocJar()
}

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"])
            
            pom {
                name.set("My Library")
                description.set("A great library for doing things")
                url.set("https://github.com/example/my-library")
                
                licenses {
                    license {
                        name.set("The Apache License, Version 2.0")
                        url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
                    }
                }
                
                developers {
                    developer {
                        id.set("johndoe")
                        name.set("John Doe")
                        email.set("john@example.com")
                    }
                }
                
                scm {
                    connection.set("scm:git:git://github.com/example/my-library.git")
                    developerConnection.set("scm:git:ssh://github.com/example/my-library.git")
                    url.set("https://github.com/example/my-library/tree/main")
                }
            }
        }
    }
    
    repositories {
        maven {
            name = "OSSRH"
            url = uri(
                if (version.toString().endsWith("SNAPSHOT"))
                    "https://s01.oss.sonatype.org/content/repositories/snapshots/"
                else
                    "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
            )
            credentials {
                username = providers.gradleProperty("ossrhUsername").orNull
                password = providers.gradleProperty("ossrhPassword").orNull
            }
        }
    }
}

signing {
    val signingKey: String? by project
    val signingPassword: String? by project
    useInMemoryPgpKeys(signingKey, signingPassword)
    sign(publishing.publications["mavenJava"])
}

// 仅在发布时才签名
tasks.withType<Sign> {
    onlyIf { !version.toString().endsWith("SNAPSHOT") }
}

~/.gradle/gradle.properties(本地配置)

properties
ossrhUsername=your-sonatype-username
ossrhPassword=your-sonatype-password
signing.keyId=ABCDEF12
signing.password=your-gpg-password
signing.secretKeyRingFile=/home/you/.gnupg/secring.gpg

GitHub Actions 发布

yaml
name: Publish to Maven Central

on:
  release:
    types: [created]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      
      - uses: gradle/actions/setup-gradle@v3
      
      - name: Publish
        run: ./gradlew publish
        env:
          OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
          SIGNING_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
          SIGNING_PASSWORD: ${{ secrets.GPG_PASSPHRASE }}
        
      - name: Release staging repository
        run: ./gradlew closeAndReleaseSonatypeStagingRepository

发布步骤

bash
# 1. 发布到 OSSRH Staging
./gradlew publish

# 2. 登录 oss.sonatype.org
# 3. 在 Staging Repositories 中找到你的仓库
# 4. Close → Release(等待同步到 Maven Central,约 10-30 分钟)

# 或者使用插件自动化
./gradlew closeAndReleaseSonatypeStagingRepository