【问题标题】:How maven packages snapshot dependencies?maven如何打包快照依赖?
【发布时间】:2017-07-05 02:48:55
【问题描述】:

我正在处理一个包含许多 maven 依赖项的大型项目,其中一些可能是传递的。

我想知道 maven 是如何打包 SNAPSHOT 依赖项的,因为当我打开一个工件时,我看到有时这些库的名称中包含 SNAPSHOT,而其他时候有一个时间戳,如下图所示:

最让我担心的是,即使使用 -U 参数打包 SNAPSHOT 库也不总是与存储库中可用的最新版本相对应。

在 pom.xml 中,依赖版本总是以“-SNAPSHOT”结尾,我们使用的是 maven 3.3.3。

【问题讨论】:

  • 请用文字代替图片,很多人在这里阅读有防火墙限制...您在谈论包装。什么样的包装? WAR's / EAR's / JAR's / ZIP ?你是怎么做到的?最好是完整的 pom 文件......有时人们使用 maven-assembly-plugin 从目标文件夹打包,这可能会导致这样的事情。等等……

标签: maven package snapshot


【解决方案1】:

快照在本地存储库和远程存储库中的处理方式不同。

mvn install 将 SNAPSHOTS 作为-SNAPSHOT 安装到本地存储库,这对于本地构建来说很好。远程存储库包含带有时间戳的 SNAPSHOT 版本,因为它们是 mvn deploy 的结果。

在本地构建期间,这两个可以混合,因为一个工件可能是本地构建 (-SNAPSHOT) 的结果,而另一个是从远程存储库 (-20170623.063055-4) 下载的。

真正的问题是它们可以以意想不到的方式混合。 Maven 尽最大努力从任何可用的存储库中获取最新的 SNAPSHOT。这很可能在您使用 -U 时发生,因为它会强制检查远程存储库。

有时这会导致错误:lib-alib-b 都是依赖项,您在 5 分钟前构建了两者,但是 CI 在 3 分钟前构建了 lib-a,然后构建将使用 CI lib-a 和您的 @ 987654333@ 因为 CI 有更新的版本。如果您修改了lib-a 中的某些内容,但 CI 的lib-a 不包含它,因为它尚未提交,那么这将是一个非常烦人的问题。

最好的策略是避免将快照部署到远程存储库。

这是一篇关于存储库内部的好文章:https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/

还有一个相关的 SO 答案:https://stackoverflow.com/a/32416454/8230378

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2017-11-06
    相关资源
    最近更新 更多