maven如何打包快照依赖项?

时间:2017-07-04 12:54:10

标签: maven package snapshot

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

我想知道maven是如何打包SNAPSHOT依赖项的,因为当我打开一个工件时,我发现有时候这些库在名称中打包了SNAPSHOT,有时候会有一个时间戳,如下图所示:

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

有时这会导致错误:lib-alib-b都是依赖项,您在5分钟前构建了这两个,但是在3分钟前构建了lib-a,然后构建将使用CI lib-a和您的lib-b因为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