Skip to content

发布到 Maven 仓库

maven-publish 插件

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

java {
    withSourcesJar()
    withJavadocJar()
}

publishing {
    publications {
        create<MavenPublication>("mavenJava") {
            from(components["java"])
            
            // 覆盖 POM 信息(可选)
            groupId = "com.example"
            artifactId = "my-library"
            version = "1.0.0"
            
            pom {
                name.set("My Library")
                description.set("A concise description of my library")
                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 {
        // 发布到本地 ~/.m2 仓库
        mavenLocal()
        
        // 发布到私有 Nexus/Artifactory
        maven {
            name = "snapshots"
            url = uri("https://nexus.example.com/repository/maven-snapshots/")
            credentials {
                username = providers.gradleProperty("nexusUsername").orNull
                password = providers.gradleProperty("nexusPassword").orNull
            }
        }
        
        maven {
            name = "releases"
            url = uri("https://nexus.example.com/repository/maven-releases/")
            credentials {
                username = providers.gradleProperty("nexusUsername").orNull
                password = providers.gradleProperty("nexusPassword").orNull
            }
        }
    }
}

发布命令

bash
# 发布到本地 Maven 仓库(~/.m2)
./gradlew publishToMavenLocal

# 发布到所有配置的仓库
./gradlew publish

# 发布到特定仓库
./gradlew publishMavenJavaPublicationToSnapshotsRepository
./gradlew publishMavenJavaPublicationToReleasesRepository

发布到 Maven Central(OSSRH)

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

// 签名配置(Maven Central 要求)
signing {
    sign(publishing.publications["mavenJava"])
    
    // 从 gradle.properties 读取 GPG 配置
    // signing.keyId=ABCDEF12
    // signing.password=your-key-password
    // signing.secretKeyRingFile=/path/to/secring.gpg
    
    // 或者使用内存中的 GPG key
    val signingKey: String? by project
    val signingPassword: String? by project
    useInMemoryPgpKeys(signingKey, signingPassword)
}

publishing {
    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
            }
        }
    }
}

下一步