6

有这样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 存储库?
4

2 回答 2

6

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

于 2013-05-17T21:10:13.353 回答
4

虽然它仍未得到官方支持,但仍然可以使用签名和 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 插件利用对后期配置的支持,这意味着在配置签名部分时生成 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 在本地测试)。

于 2017-08-11T20:47:50.510 回答