我们有一个大型的多模块maven项目。为了提高开发效率,我们最近开始将快照部署到远程存储库(通过中央构建),并引入了maven配置文件,这意味着用户只需要签出并构建模块子集并为其余部分创建快照。我们还将远程存储库的更新策略设置为“never”,以确保在我们想要更新本地快照时它是明确的。因此,典型的命令是; mvn -Pref -U清理安装。
现在,在maven反应器中,配置文件中定义的模块的构建工作完美,maven使用快照来实现其依赖关系,包括从远程存储库下载任何更新的模块(重要说明;确保我们有一致的集合快照,我们的中央部署是来自我们项目的所有模块快照,即使只有其中几个已更改)。
当maven随后将依赖关系从配置文件外部的模块解析为那些本地构建的模块时,问题就好了 - 如果自从构建这样的模块以来已经远程部署了快照,那么maven会将此视为更多最新版本并继续下载并覆盖本地构建的快照。这可能导致其他模块期望本地更改模块的中断。
基本上我想在我的配置文件中的任何模块中通过任何远程快照选择“使用本地构建的快照”,即使时间戳指示远程快照更新。
在这种情况下,其他人做了什么?
谢谢,
保
答案 0 :(得分:7)
如果你可以更新到Maven 3,你可以使用--no-snapshot-updates
命令行开关(-nsu
也可以保存输入)。该选项的错误在3.0.4中已修复,因此请确保您使用的是最新版本。
您也可以尝试离线模式,但这将停止所有更新检查,直到您停止“离线”。首先,进行构建以确保将所有依赖项下载到本地存储库。然后,您可以通过将<offline>true</offline>
添加到settings.xml(并在准备好再次开始检查更新时将其切换为false
)或使用-o
或{进入离线模式执行构建时{1}}命令行开关。这适用于Maven 2或3。
答案 1 :(得分:1)
我认为您必须防止部署未更改的快照。部署快照基本上是这样说的:
“现在这是最新最好的快照,请选择我以上(在 时间戳的快照“
我猜你可以为你的本地快照做一些jiggery-pokery,例如将一些脚本链接到install
阶段,该阶段在不久的将来设置快照的时间戳元数据(因此Maven总是选择远程本地)快照)。但这对我来说听起来并不好!
源控制提交可以触发快照部署。你可以这样做吗?
答案 2 :(得分:0)
问题必须更新哪些工件以及哪些工件不能更新是一个非常难的问题,不仅对于maven,对于用户也是如此。 Maven不是人工智能。我认为您可以在离线模式下构建项目以避免工件下载(但是,确定,您想要更新的工件不会更新)。
3年前,我们试图解决这个问题:build(你的中心版本)必须只包含版本(没有快照)。在那里 - 你可以肯定,如果你构建项目 - 它是相同的代码稳定。如果更改了某个工件,则可以创建模块的快照,完成工作后,您可以创建版本并更新依赖项。 但,它会导致另一个问题:如果您没有大型自动测试系统,您可以花费大量时间来创建版本(bug - &gt; fix - &gt; version - &gt;错误 - &gt;修复 - &gt;版本 - &gt;等)。
今天我在小团队工作,如果有人更新他的部分,他只是说,并且每个想要更新的人 - 接受 - 而不是 - 不接受。
我不是这类问题的大师。所以,我很高兴听到更简单的方法来避免这个问题。
答案 3 :(得分:0)
我知道这已经很老了,但遇到了同样的问题并通过将构建分为两个步骤解决了这个问题:
第一步是快照更新而不构建任何内容并且运行速度非常快。
然后第二步是常规构建/测试,但没有updatig快照。