使用maven publish gradle插件获取已发布工件的uri

使用maven publish gradle插件获取已发布工件的uri,gradle,nexus,maven-publish,Gradle,Nexus,Maven Publish,发布之后,我想知道发布工件的url是什么(以便在其他gradle任务中使用它进行自动部署) 有没有办法捕获生成的url?遗憾的是,通过gradle构建系统无法获取此信息。。。您可以做的是创建一个任务来完成发布任务。然后让该任务查询maven存储库中的最新版本。Maven将查看Maven metadata.xml文件,并返回标记值或最新上载(如果缺少)。您可以从响应的位置标题获得确切的下载url 下面是一个如何查询maven回购的示例 $ curl -Is 'http://my.nexus.rep

发布之后,我想知道发布工件的url是什么(以便在其他gradle任务中使用它进行自动部署)


有没有办法捕获生成的url?

遗憾的是,通过gradle构建系统无法获取此信息。。。您可以做的是创建一个任务来完成
发布
任务
。然后让该
任务
查询maven存储库中的最新版本。Maven将查看
Maven metadata.xml
文件,并返回
标记值或最新上载(如果缺少)。您可以从响应的
位置
标题获得确切的下载url

下面是一个如何查询maven回购的示例

$ curl -Is 'http://my.nexus.repo.com:8081/nexus/service/local/artifact/maven/redirect?r=Release&g=com.my.group.id&a=myArtifactId&v=RELEASE&p=war' | grep -Fi Location | cut -d' ' -f2

http://my.nexus.repo.com:8081/nexus/service/local/repositories/Release/content/com/my/group/id/myArtifactId/1.0.012/myArtifactId-1.0.012.war
解释命令

curl -Is http://<nexus-url>:<nexus-port>/nexus/service/local/artifact/maven/redirect?r=<nexus-repository>&g=<artifact-group-id>&a=<artifact-name>&v=<artifact-version>
    curl
        -I # only print return headers
        -s # quiet output of curl's downloading progress
    url params
        r  # nexus-repository name, tends to be Release or Snapshot
        g  # group id for the artifact
        a  # artifact id
        v  # artifact version or a link like RELEASE (don't use LATEST it's problematic)
        ##  you can also supply classifier and extension if needed
        c  # artifact classifier
        e  # artifact extension
curl-Is http://:/nexus/service/local/artifact/maven/redirect?r=&g=&a=&v=
卷曲
-I#仅打印返回标题
-curl下载进度的s#quiet输出
url参数
r#nexus存储库名称,通常是发行版或快照
工件的g#组id
a#工件id
v#工件版本或类似链接的版本(不要使用最新版本,这是有问题的)
##如果需要,还可以提供分类器和扩展
c#伪影分类器
伪影扩展

我找到了一个名为
maven metadata remote.xml
的文件的本地副本,该文件已上载。它位于以下目录下:
build/tmp/publishmavenpublicationtonexusresposition/

例如:

$ cat build/tmp/publishMavenPublicationToNexusRepository/com/example/my.package/0.1.0-SNAPSHOT/maven-metadata-remote.xml

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.example</groupId>
  <artifactId>my.package</artifactId>
  <version>0.1.0-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20180326.191238</timestamp>
      <buildNumber>36</buildNumber>
    </snapshot>
    <lastUpdated>20180326191238</lastUpdated>
  </versioning>
</metadata>

您可以扩展所有maven发布任务并再次计算url: 我只需要文件夹-对于发布工件,您也可以在最后添加工件,但我还没有找到一个好的快照解决方案。nexus基本回购URL预计是已知的

tasks.withType(AbstractPublishToMaven) {
    doLast {
        String urlString = nexusUrl.toString() + convertPackageNameToPath(publication.groupId) + "/" + publication.artifactId + "/" + publication.version
        println "Artifact URL: " + urlString
    }
}

static String convertPackageNameToPath(String packageName) {
    return packageName.replace(".", "/");
}

@Hollerweger的答案可能是最不粗俗的,但在以下几个方面是错误的:

  • publishToAvenLocal
    publishToAvenRepository
    的超类。扩展它并打印一条消息说工件已发布到Nexus是错误的,因为即使发布到本地Maven repo,该消息也将被打印。要使用的正确任务类是发布到远程repo的
    PublishToMavenRepository
  • 不需要知道远程回购URL;出版物具有
    存储库
    属性
  • 总而言之:

    tasks.withType(PublishToMavenRepository) {
        doFirst {
            println("Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}")
        }
    }
    

    在我的例子中,它似乎不是快照的完整url,因为url还包括“yyyyMMdd.HHmmSS”模式和发布索引。你有什么诀窍吗?@Kikiwa为你的特例打开了一个新问题。谢谢你的建议,本地maven-medata-remote.xml的诀窍对我来说很不错。这种方法更简洁,但没有考虑快照策略的Maven/Nexus版本控制机制。(此策略在URL中的文件扩展名之前添加了日期和内部版本号,据我所知,不幸的是没有快捷方式。)@Kikiwa URI是发布到Maven存储库的,而不是发布到工件,因此它与快照无关。我们在公司中使用此解决方案,并按预期工作。如果您找到了一个适合您的解决方案,这很酷,但是,正如我之前所说的,请使用示例应用程序打开一个新问题。
    tasks.withType(PublishToMavenRepository) {
        doFirst {
            println("Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}")
        }
    }