【问题标题】:How to sign maven publications with gradle如何使用 gradle 签署 maven 出版物
【发布时间】:2013-05-15 08:29:23
【问题描述】:

有这样的build.gradle 使用新发布插件的脚本:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'signing'
apply plugin: 'maven-publish'

// ...

publishing {
    publications {
        maven(MavenPublication) {
            from components.java

            artifact sourcesJar {
                classifier 'source'
            }
        }
    }

    repositories {
        maven {
            name 'Temporary'
            url "file://${rootProject.buildDir}/repo"
        }
    }
}

signing {
    sign configurations.archives
}

所以问题是:

  1. 如何签署maven pom?
  2. 如何将签名发布到 maven 存储库?

【问题讨论】:

    标签: gradle signing gnupg


    【解决方案1】:

    新的孵化中的maven-publish 插件还不支持签名。

    【讨论】:

    • 谢谢,所以将回滚以使用maven 插件。
    • 希望看到那些需要将开源代码发布到 maven Central 的用户支持签名和用户名/密码。
    • 暂时,你必须使用maven插件。
    • @PeterNiederwieser,当您说“maven-publish 插件尚不支持签名”时,我不确定您的意思。鉴于上面示例中的签名插件工作得很好,即按预期生成 .asc 文件,这真的不是要找到一种方法来告诉 maven-publish 插件像任何其他工件一样简单地上传它们吗?
    • 从 Gradle 2.2 开始,我的回答仍然有效。
    【解决方案2】:

    虽然它仍然支持 not officially,但仍然可以使用签名和 maven-publish 插件上传签名的工件。

    首先,我们照常设置签名部分:

    apply plugin: 'signing'
    
    signing {
      sign configurations.archives
    }
    

    这将签署项目的档案。为了对 maven-publish 插件创建的 POM 进行签名,我们添加了一个签名任务:

    task signPom(type: Sign) {
      sign project.file('build/publications/maven/pom-default.xml')
      outputs.upToDateWhen { false }  // the signing plugin does not seem to notice
                                      // it when the publications folder with the
                                      // signature has been deleted. So we always
                                      // create a new signature
    }
    

    不能简单地添加sign generatePomFileForMavenPublicationsigning 作为 maven-plublish 插件 leverages support for late configuration 这意味着在配置签名部分时生成 pom 的任务不可用。

    现在我们有了我们需要的所有签名文件。我们只需要将它们添加到 发表:

    apply plugin: 'maven-publish'
    
    publishing {
      publications {
        maven(MavenPublication) {
          from components.java
    
          project.tasks.withType(Sign) {
            signatures.all {
              def type = it.type
              if (it.file.name.endsWith('.tar.gz.asc')) {  // Workaround in case a tar.gz file should published
                type = 'tar.gz.asc'
              } else if (it.type.equals('xml.asc')) {  // Set correct extension for signature of pom file
                type = 'pom.asc'
              }
              artifact source: it.file, classifier: it.classifier ?: null, extension: type
            }
          }
    
          pom.withXml {
            // The pom can be enriched as usual
          }
        }
      }
    }
    

    这将获取由构建创建的所有签名文件,并将它们作为工件添加到发布中。为了正确命名 pom 文件,需要将文件扩展名 xml.asc 替换为 pom.asc(maven-publish 插件将 pom 本地存储为 pom-default.xml)。

    所有任务都在那里并相互关联,最后要做的事情 就是在模型中设置依赖:

    model {
      tasks.publishMavenPublicationToMavenLocal {
        dependsOn project.tasks.withType(Sign)
      }
      tasks.publishMavenPublicationToNexusLocalSnapshotsRepository {
        dependsOn project.tasks.withType(Sign)
      }
      tasks.signPom {
        dependsOn tasks.generatePomFileForMavenPublication
      }
    }
    

    第二个任务的名字取决于仓库的名字 publications.repository 部分。我的叫“NexusLocalSnapshots”。

    这种方法的唯一缺点是每个签名文件都有一个 md5 并创建 sha1 校验和文件。这似乎不是问题 存储库管理器,不过(使用 Nexus 3 在本地测试)。

    【讨论】:

    • Gradle 在 6.5 或 7 中是否支持签署 maven 出版物?我似乎有签名插件可以对我的工件进行签名,但它们不再被上传。在我设置签名之前,正在上传未签名的工件...
    猜你喜欢
    • 2018-07-26
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2013-09-06
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多