使用Gradle maven-发布和签名插件时缺少校验和文件

hgqdbh6s  于 2022-10-26  发布在  Maven
关注(0)|答案(2)|浏览(243)

我有一个利用Gradle构建和打包的Java项目。我的目的是创建发布到Maven Central的构件。
作为第一步,我配置了Gradle项目,如文档中的以下示例所示:
Https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:complete_example
当我运行gradle publishToMavenLocal时,我在本地存储库中安装了以下文件:
Maven-metadata-local.xml
My-library-1.0.2-SNAPSHOT.jar
My-library-1.0.2-SNAPSHOT.jar.asc
My-library-1.0.2-SNAPSHOT-javadoc.jar
My-library-1.0.2-SNAPSHOT-javadoc.jar.asc
My-library-1.0.2-SNAPSHOT.pom
My-library-1.0.2-SNAPSHOT.pom.asc
My-library-1.0.2-SNAPSHOT-sources.jar
My-library-1.0.2-SNAPSHOT-sources.jar.asc
文件都没问题。我唯一的问题是没有生成校验和文件(MD5和SHA1)。但是,要通过OSS Sonatype在Maven Central上部署构件,必须使用校验和文件。
如何生成丢失的校验和文件?似乎maven-发布签名插件没有用于此目的的选项?怎么啦?

yqhsw0fo

yqhsw0fo1#

我找到的解决方案是使用shadowant.checksum

tasks.withType(Jar) { task ->
    task.doLast {
        ant.checksum algorithm: 'md5', file: it.archivePath
        ant.checksum algorithm: 'sha1', file: it.archivePath
        ant.checksum algorithm: 'sha-256', file: it.archivePath, fileext: '.sha256'
        ant.checksum algorithm: 'sha-512', file: it.archivePath, fileext: '.sha512'
    }
}

调用gradle publishShadowPublicationToMavenLocal将根据需要生成签名,但不会将它们发布到~/.m2
起初,我认为这些签名应该是自动的,所以我打开了https://github.com/johnrengelman/shadow/issues/718进行讨论。

44u64gxh

44u64gxh2#

我认为这是Gradle中的一个错误,我打开了一个问题,但正如这里描述的那样,这实际上模拟了mvn install的行为。听起来Maven Local的工作原理与Maven Repository略有不同。
在本地测试这一点的正确方法是使用基于文件的存储库。由于您只使用它来测试(而不是实际与其他项目共享内容),我认为将其放入构建目录中是最好的。将下面的repositories部分添加到publishing块中。然后,当您./gradlew publish时,它将发布到您的构建目录。

Kotlin

repositories {
    maven {
        // change URLs to point to your repos, e.g. http://my.org/repo
        val releasesRepoUrl = uri(layout.buildDirectory.dir("repos/releases"))
        val snapshotsRepoUrl = uri(layout.buildDirectory.dir("repos/snapshots"))
        url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl
    }
}

Groovy

repositories {
    maven {
        // change URLs to point to your repos, e.g. http://my.org/repo
        def releasesRepoUrl = layout.buildDirectory.dir('repos/releases')
        def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots')
        url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
    }
}

这两个样本实际上来自您共享的链接。它们可能是后来添加的,或者您(像我一样)认为publishToMavenLocal的行为应该与publish相同(不同于文件的实际位置)。

相关问题