在所有上传工件后,maven 是不是总是部署 maven-metadata.xml 文件

Posted

技术标签:

【中文标题】在所有上传工件后,maven 是不是总是部署 maven-metadata.xml 文件【英文标题】:Does maven alway deploys maven-metadata.xml file after all uploading artifacts在所有上传工件后,maven 是否总是部署 maven-metadata.xml 文件 【发布时间】:2017-10-11 00:57:38 【问题描述】:

maven 部署工件有什么顺序吗?据我所知,我可以说它上传了所有工件,最后它更新了 maven-medata.xml 文件

http://localhost:8000/mavenrepository/test1/com/mypackage/mavenproject1/1.0-SNAPSHOT/maven-metadata.xml http://localhost:8000/mavenrepository/test1/com/mypackage/mavenproject1/maven-metadata.xml

现在是否保证maven在上传其他工件后总是最后上传这2个文件?

【问题讨论】:

【参考方案1】:

Maven 总是以相同的顺序部署工件文件。它通常看起来像这样:

[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ hello-world ---
Downloading: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/maven-metadata.xml
Uploading: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/hello-world-1.0-20160430.031713-1.jar
Uploaded: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/hello-world-1.0-20160430.031713-1.jar (3 KB at 11.5 KB/sec)
Uploading: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/hello-world-1.0-20160430.031713-1.pom
Uploaded: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/hello-world-1.0-20160430.031713-1.pom (2 KB at 41.6 KB/sec)
Downloading: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/maven-metadata.xml
Uploading: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/maven-metadata.xml
Uploaded: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/1.0-SNAPSHOT/maven-metadata.xml (798 B at 21.1 KB/sec)
Uploading: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/maven-metadata.xml
Uploaded: http://localhost:48080/storages/storage0/snapshots/org/foo/examples/hello-world/maven-metadata.xml (312 B at 8.7 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

如您所见,它所做的第一件事是尝试在工件级别解析maven-metadata.xml 文件,以确定该工件是否有其他版本以及是否生成全新的maven-metadata.xml 文件,或使用它正在部署的新版本更新现有版本(如果有的话)。 maven-metadata.xml 文件始终在部署结束时生成或更新。

maven-metadata.xml 文件可以位于三个级别:

工件级别:这是在groupId/artifactId 级别,(例如,如果您的groupIdorg.foo.examples 并且您的artifactIdhello-world,则路径将为org/foo/examples/hello-world/maven-metadata.xml)。这用于管理基本版本或发布版本。 版本级别:这在groupId/artifactId/version 级别,(例如,如果您的groupIdorg.foo.examples 并且您的artifactIdhello-world 并且版本是1.0-SNAPSHOT ,路径将是org/foo/examples/hello-world/1.0-SNAPSHOT/maven-metadata.xml)。这用于管理带时间戳的快照。 插件组级别:在插件的groupId级别,用于管理同一插件组下的不同插件。

有关 Maven 元数据如何工作的详细说明,请查看我整理的 this article。

【讨论】:

注意到与您提到的相同的事情。但我也观察到一件奇怪的事情。在部署源和java文档以及jar.maven-metadata.xml文件时会更新多次。一次用于pom.xml和jar.xml,然后在上传source-jar后一次,然后再次更新 java 文档时。但是包级别/工件级别的 maven-metadata.xml 仅在 jar pom 和版本级别 maven-metadata.xml 更新后更新一次。在这种情况下,版本级别 maven-metadata.xml 在 packagelevel maven-metadata.xml 更新后更新了 2 次。您的想法? 如果您的项目产生了几个子工件,例如javadocssources等,这些都会被添加到maven-metadata.xml文件中。 maven-metadata.xml 文件还包括您的 pom 的 GAV(groupIdartifactIdversion)坐标信息,因为这也被视为子工件。因此,对于任何产生jar(并且没有其他子工件)的项目,您的maven-metadata.xml 文件还将包含您的pom.xml 的详细信息。当然,如果您使用的是maven-deploy-plugin(这是默认行为),这就是全部。 我同意。我唯一担心的是包/工件级别的 maven-metata.xml 不是我在上面评论中建议的最后一个要更新的文件。你同意吗? 尝试部署一个工件并粘贴整个输出。我的顺序总是一样的。 只是好奇。想知道 Maven 如何同时处理存储库中相同包版本的并发更新。像 2 dev 尝试同时在存储库中推送相同版本的包。这里没有事务。

以上是关于在所有上传工件后,maven 是不是总是部署 maven-metadata.xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

Maven 发布插件失败:源工件被部署两次

将工件上传到 Nexus,无需 Maven

ProGet 上传本地工件

使用 Maven 在 Nexus 中自动上传工件

没有使用 jenkins gradle artifactory 插件部署的工件

从 nexus 获取最新的构建工件