如何与gradle签署maven出版物

如何与gradle签署maven出版物,gradle,signing,gnupg,Gradle,Signing,Gnupg,拥有使用新发布插件的build.gradle脚本: apply plugin: 'java' apply plugin: 'groovy' apply plugin: 'signing' apply plugin: 'maven-publish' // ... publishing { publications { maven(MavenPublication) { from components.java artif

拥有使用新发布插件的
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
}
因此,问题是:

  • 如何签署maven pom
  • 如何将签名发布到maven存储库

  • 新的酝酿中的
    maven publish
    插件还不支持签名。

    尽管它仍然支持签名,但仍然可以使用签名和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
    }
    
    不可能简单地添加一个
    符号generatePomFileForMavenPublication
    行 作为maven plublish插件进行签名,这意味着在配置签名部分时,生成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校验和文件。这似乎不是一个问题
    不过,repository manager(使用Nexus 3在本地测试)。

    谢谢,因此将回滚到使用
    maven
    插件。希望看到那些需要将开放源代码发布到maven central的用户支持签名和用户名/密码。目前,您必须使用
    maven
    插件。@PeterNiederwieser,我不知道你说“maven发布插件还不支持签名”是什么意思。鉴于上面示例中的签名插件工作正常,即按预期生成.asc文件,这难道不是真的要找到一种方法,让maven publish插件像其他工件一样简单地上传它们吗?从Gradle 2.2开始,我的答案仍然有效。Gradle是否支持在6.5或7中签名maven出版物?我似乎有签名插件在为我的工件签名,但它们不再被上传。在我设置签名之前,未签名的工件正在上载。。。