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

如何在Gradle Kotlin DSL中用maven-publish插件签名POM文件

解决Gradle Kotlin DSL中Maven Publish的POM签名问题

我之前也踩过这个坑!在Gradle Kotlin DSL里用maven-publish插件时,单纯给archives配置签名已经不适用了——这是旧版maven插件的逻辑,而maven-publish是基于publications来管理所有发布构件的。要让POM文件也生成签名,你需要把签名目标切换到你的Maven Publication上,同时调整构件的关联方式。

调整后的完整配置

下面是修改后的代码,重点优化了signing块和publishing.publications部分:

plugins {
    `maven-publish`
    signing
    id("org.jetbrains.dokka") version "1.4.10.2"
}

repositories {
    mavenCentral()
}

group = "my.group"
version = "1.0.0"

tasks {
    val sourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(sourceSets.main.get().allSource)
    }

    val javadocJar by creating(Jar::class) {
        dependsOn(dokkaJavadoc)
        archiveClassifier.set("javadoc")
        from(dokkaJavadoc)
    }
}

@Suppress("UnstableApiUsage")
signing {
    useGpgCmd()
    // 关键修改:签名目标改为maven publication,而非旧版的archives配置
    sign(publishing.publications["maven"])
}

@Suppress("UnstableApiUsage")
publishing {
    repositories {
        maven {
            val releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
            val snapshotsRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/snapshots/"
            url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl)
            credentials {
                username = project.properties["ossrhUser"].toString()
                password = project.properties["ossrhPassword"].toString()
            }
        }
    }

    publications {
        create<MavenPublication>("maven") {
            // 自动关联项目主jar构件
            from(components.java)
            // 手动添加sources和javadoc构件
            artifact(tasks["sourcesJar"])
            artifact(tasks["javadocJar"])

            groupId = "my.group"
            artifactId = "my-lib"
            version = "1.0.0"

            pom {
                name.set("my-lib")
                description.set("desc")
                url.set("...")
                licenses {
                    license {
                        name.set("The Apache License, Version 2.0")
                        url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                    }
                }
                developers {
                    developer {
                        id.set("Balage1551")
                        name.set("Balazs Vissy")
                        email.set("...")
                    }
                }
                scm {
                    connection.set("...")
                    developerConnection.set("...")
                    url.set("...")
                }
            }
        }
    }
}

关键修改点说明

  1. 签名目标切换:把sign(configurations.archives.get())改成sign(publishing.publications["maven"]),这样签名插件会处理该publication下的所有内容——包括POM文件、主jar、sourcesJar、javadocJar,自动为它们生成对应的.asc签名文件。
  2. 构件关联优化:用from(components.java)自动关联项目的主jar构件,再通过artifact()手动添加sources和javadoc jar,maven-publish会自动把这些构件纳入发布流程,不需要原来的artifacts块了。
  3. 移除冗余配置:删掉了旧版maven插件的引用和artifacts块,因为maven-publish已经完全替代了旧插件的发布功能。

这样执行publish任务时,Gradle会为POM文件生成签名,上传后Nexus的验证就能顺利通过了。

内容的提问来源于stack exchange,提问作者Balage1551

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:32:59