我正在开发一个包含许多maven依赖项的大项目,其中一些可能是传递的。
我想知道maven是如何打包SNAPSHOT依赖项的,因为当我打开一个工件时,我发现有时候这些库在名称中打包了SNAPSHOT,有时候会有一个时间戳,如下图所示:
最让我担心的是,即使使用-U参数打包SNAPSHOT库并不总是对应于存储库中可用的最新版本。
在pom.xml中,依赖版本总是以" -SNAPSHOT"结尾。我们正在使用maven 3.3.3。
答案 0 :(得分:1)
快照在本地存储库和远程存储库中的处理方式不同。
mvn install
将SNAPSHOTS作为-SNAPSHOT
安装到本地存储库,这对于本地构建来说很好。远程存储库包含带有时间戳的SNAPSHOT版本,因为它们是mvn deploy
的结果。
在本地构建期间,这两个可以混合,因为一个工件可能是本地构建的结果(-SNAPSHOT
)而另一个是从远程存储库(-20170623.063055-4
)下载的。
真正的问题是他们可能以意想不到的方式混合。 Maven尽力从任何可用的存储库中获取最新的SNAPSHOT。当您使用-U
强制检查远程存储库时,很可能会发生这种情况。
有时这会导致错误:lib-a
和lib-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