【问题标题】:How to get a list of maven dependencies and the repositories they were fetched from如何获取 Maven 依赖项列表以及从中获取它们的存储库
【发布时间】:2016-08-18 20:53:35
【问题描述】:

我想,给定一个 pom.xml 文件,展开传递依赖,并且对于每个直接和传递依赖,列出 maven 从中获取它的存储库。

有了maven-dependency-plugin我可以做到

mvn dependency:tree 获取传递依赖树,但不包含存储库信息

mvn dependency:list-repositories 获取使用的存储库列表,但不包含依赖信息

mvn dependency:get -Dartifact=<...> 获取单个工件和传递依赖项,但它似乎获取的比需要的多得多,我不知道我真正关心的是哪个。

【问题讨论】:

  • 你想解决什么样的问题?
  • 我正在尝试迁移我们的代码库以使用不支持传递依赖解析的 Bazel。我想用maven解决依赖,用输出生成下载和依赖的Bazel规则,让Bazel做下载的工作。

标签: java maven


【解决方案1】:

我认为没有插件可以做到这一点。我认为原因是没有人对这类信息真正感兴趣。

考虑对已发布工件有依赖关系。一旦它们被下载到你的本地仓库,Maven 就不会再下载它们了(除非你删除它们);该工件的所有未来解决方案都将通过本地 repo 完成。

当然,您本地 repo 的工件目录中的文件 _remote.repositories 将包含从中下载它的 repo 的 符号 名称,其实际 URL 可能会或可能不会随着时间的推移而相同。 p>

这样的理念是 Maven 坐标是全局的。例如,(比如说)commons-codec:commons-codec:1.10 的给定版本必须相同,无论它来自何处。否则,如果某些版本根据它们的来源而有所不同,那么一切都会分崩离析。因此,没有人关心依赖从何而来。

快照依赖是另一回事,但您不应该依赖它们太久,因为您不想基于将来可能发生变化的依赖发布您的东西。通常,您可以控制您希望快照依赖项来自何处,因此找出您的依赖项来自何处 的全部意义就变得徒劳了。

尽管如此,传递依赖项有时会包含 POM,这些 POM 为 Maven 指定额外的存储库以从中获取子依赖项。有时这些存储库会被停用或停止,从而破坏依赖链。在这种情况下,您可能希望在您的 settings.xml 中阻止或重新路由它们。对本地仓库中的所有 POM 进行简单扫描通常就足以嗅出它们:

# Linux/Unix
%> find <your local repo> -name '*.pom' | xargs grep -c '<repositories>' | grep -v ':0'

这与mvn dependency:tree 一起应该足以确定传递依赖项是否依赖于行为不端的存储库。

【讨论】:

  • 感谢您的详细回答。对于我的用例,我确实需要至少完整的依赖树(请参阅我对问题的评论)。如果 dep 已经是我的 pom.xml 中的直接依赖项,则看起来 mvn dependency:tree 不会报告传递依赖项。有没有办法强制它枚举完整的树?
猜你喜欢
  • 2017-01-23
  • 2016-06-05
  • 2018-07-22
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 2014-10-17
  • 2011-02-18
相关资源
最近更新 更多