【问题标题】:How can I get a list of GAVs a maven package command will produce?如何获取 Maven 包命令将生成的 GAV 列表?
【发布时间】:2016-05-08 01:02:14
【问题描述】:

我正在寻找一个(受支持的)基于 mvn 的命令,它会为我提供运行 mvn package 命令会产生的所有工件的所有 GroupID:ArtifactID:Version (GAV) 的列表。

对于没有父 pom 的单模块 Maven 项目,这很简单:您可以查看 pom 内部。

对于带有父 pom 的单模块 Maven 项目,您可以使用 help:effective-pom,它将显示一个带有 <version> 元素的 pom 文件。

对于多模块 Maven 项目(reactor),您实际上可以这样做(没想到,刚刚通过尝试学习)。这将允许为(多个)<project> 元素解析文件。

还有什么要考虑的吗?

这样做的总体目标是能够为下游持续交付 (http://go.cd/) 阶段/步骤/作业提供有关应使用其上游依赖项的哪个版本的信息。

【问题讨论】:

  • 如果计算限定符(如 *-source、*-tests、*-javadocs),单个 maven 模块实际上可以产生多个工件。并且通过对 maven jar 插件的丑陋调用,我确信我可以操纵它甚至产生多个 GAV。我认为唯一“安全”的方法是运行“mvn install”,看看最终会被放入本地仓库
  • 使用 maven-jar-plugin 我非常怀疑您为不同的 groupId:artifactId:version 创建 jar 导致 maven-jar-plugin 附加/替换由定义的主项目的工件它是 pom,它只能有一个 g:a:v ...

标签: maven go-cd


【解决方案1】:

通常您无法在构建运行之前生成列表...问题是基于 pom 模型并没有描述所有工件,因为某些插件可以产生补充工件(maven-assembly-plugin、maven -shade-plugin、maven-jar-plugin 通过 test-jar 等)

您可以做的是在构建运行后获取生成的工件列表..(安装)。你的问题inspired me to implement an EventSpy 在构建结束时生成这样的列表......看起来像这样:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.423 s
[INFO] Finished at: 2016-05-08T13:22:10+02:00
[INFO] Final Memory: 24M/310M
[INFO] ------------------------------------------------------------------------
[INFO] --             Maven Artifact Collector Summary                       --
[INFO] ------------------------------------------------------------------------
[INFO] test.maven.plugin.profiler:parse-pom:0.1.0-SNAPSHOT:jar
[INFO] test.maven.plugin.profiler:parse-pom:0.1.0-SNAPSHOT:pom
[INFO] test.maven.plugin.profiler:parse-pom:0.1.0-SNAPSHOT:jar:jar-with-dependencies

我能做的是增强它并编写一个包含信息的文件(或多或少任何格式)...目前它只是一个 PoC...也许您可以提供更多信息或创建问题或 PR 并请求可能需要的内容...可能这对其他人来说也很有趣...

此外,您的下游部分必须使存储库缓存中的这些工件可用(在文件系统上或通过存储库管理器或 docker 数据容器)...

【讨论】:

  • 我有一个自制的 Maven 存储库(目前用 Python 编写),它允许一个存储库成为许多父母的孩子。对于构建步骤链中的每个步骤,我在步骤开始时创建一个存储库,几乎是:curl http://repo-manager/repo/child-build-step/1/run/1 -d parent=parent-build-step/1/run/2 这使得 parent-build-step/1/run/2 中的所有工件都可用于 child-build 的当前构建-step。
  • 使用“我的”解决方案,您始终可以使用无版本依赖项,并且只需从您有权访问的存储库中提取最新版本。您只能访问管道树/祖先中的构建。您可能会得到一个类似的解决方案,每个构建步骤都有一个“物理”和一个“虚拟”存储库。我在 Nexus 2 上的体验简直太糟糕了(企业级,约 200 GB 或每月永久存储的新工件),我发现没有理由在它上面浪费更多时间。 Nexus 3 不附带官方 Maven 存储库支持。 Artifactory 可以工作,但 API 需要购买许可证。
  • 第一个 Nexus 2 和 3 对 SNAPSHOT 有清理任务(我正在处理大于 1 TiB 等的大小。没问题)。此外,Nexus 3 支持 Maven repo 开箱即用......你所说的无版本部门是什么意思?
  • 我们保留了一组严格的 10 个快照。 200 GB 不是快照,当我离开时我们存储了超过 4 TiB。使用我们自己的清理脚本,快照占了相当固定的大小并且可以很好地旋转。无版本依赖是当 poms/build.gradle 依赖的版本值被 CI/CD 系统覆盖的每个构建时。他们根据构建步骤的流水线选择正确的版本。如果您想要可追溯性(或非开发分支上的标记/提交历史记录,或单独的存储库),请将变更集 ID 和 pom 文件放入二进制文件中。
  • 嗯,好的。所以你只需要一个策略来删除没有标记的已发布工件?
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多