Maven 内部依赖的版本控制

Posted

技术标签:

【中文标题】Maven 内部依赖的版本控制【英文标题】:Maven versioning of internal dependencies 【发布时间】:2017-01-30 21:00:43 【问题描述】:

假设我们有一个使用Maven 的项目,并且有一些dependencies 是在同一公司/团队甚至是同一个人开发的。很明显,当一些开发者想要compile该项目时,如果specified dependencies还没有,则会从repo中获取并下载到本地。

现在让我们假设以下场景:

开发人员确实不关心依赖关系和

    依赖的版本是 x.x.x.SNAPSHOT => maven 将每 24 小时从 repo 获取 最新版本(默认情况下)。 问题:如果这个版本与你的项目不兼容,基本上你甚至都不知道发生了什么,因为你没有改变你的项目中的任何东西。这里唯一可能的解决方案是在本地编译和管理依赖项。

    依赖的版本是“x.x.x.y” => maven 将准确地获取这个版本,而不是别的。因此,要更新此依赖项,我需要更改版本。 问题:似乎意味着每次这个依赖发生一些变化并且代码被推送到服务器时版本必须改变。但这听起来很荒谬。

可能的解决方案:

似乎在这种情况下唯一可能的解决方案是手动处理internal dependencies(从 repo 获取源并在本地编译)。然而,这两个问题困扰着我:

    这个解决方案打破了maven 的整个想法,它应该获取所有依赖项。 此解决方案会给只想开始项目开发但不关心那些依赖项的开发人员带来困难(因为这些依赖项并未在他们正在处理的项目部分中使用)。

有更好的解决方案吗?

【问题讨论】:

如果开发人员不关心依赖关系,而不是他根本没有认真对待他的工作..此外,SNAPSHOT 表示您处于开发人员之下,这意味着它将改变...不兼容性由 major.minor 表示.patch verison...(如果您遵循 semver)...如果您使用不可变的版本,那么您需要更新您的依赖项,如果它们有新版本而不是您的版本控制中记录的版本。跨度> 如果我们一直在手动和本地编译,那不是说使用 maven 没有意义吗? 也许我说的不在乎太多了,但我的意思是开发人员对依赖项不感兴趣,而是想要最新的工作版本,但是,这个依赖项正在开发过程中。 如果开发人员喜欢使用正在开发的最新版本,那么使用major.minor.patch-SNAPSHOT 是可行的方法...除此之外,开发人员必须了解依赖关系和需要了解他正在使用什么...需要有兴趣...如果您需要单独编译许多模块,您可能需要考虑从它创建一个多模块构建... 【参考方案1】:

您还可以通过使您的 maven 与您自己管理的 Web 存储库一起工作来处理最新的稳定依赖项。因此,您将确保所有工作人员都有所需版本的插件、框架等。我们的团队使用 TeamCity 服务器来构建工作台,.m2/settings.xml 也被配置为与我们的 TC 服务器存储库一起使用。团队负责人控制着所有版本。

【讨论】:

以上是关于Maven 内部依赖的版本控制的主要内容,如果未能解决你的问题,请参考以下文章

快照/发布:Maven 项目的版本控制策略

Java、Maven Jar 文件版本控制部分

Python项目的依赖控制

《Maven实战》笔记-9-版本管理

maven:prfile应用示例,通过profile控制在不同的平台依赖对应的库

maven:profile应用示例,通过profile控制在不同的平台依赖对应的库