如何用gradle签署maven出版物

时间:2013-05-15 08:29:23

标签: 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

            artifact sourcesJar {
                classifier 'source'
            }
        }
    }

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

signing {
    sign configurations.archives
}

所以问题是:

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

虽然它仍然受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 generatePomFileForMavenPublication行 以signing作为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 )。 / p>

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

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进行本地测试)。