在多模块 Maven 项目中更新模块版本的最佳策略是什么
What is the best stategy to update modules version in multi-module Maven project
给定:多模块 Maven 项目
任务:每次发布后更新版本
我看到两种不同的策略:
策略 1 - 整个更新:更新所有模块的版本,不管是否有更新
策略 2 - 简约更新:仅更新实际受影响的那些模块的版本
假设我们有以下项目结构:
root
---dao
---domain
---web
---site1
---site2
---processors
---processor1
---processor1Service
---processor1Util
---processor1Tests
---processor2
---processor2Service
---processor2Util
---processor2Tests
---simulators
---simulator1
---simulator1Service
---simulator1Util
---simulator1Tests
---simulator2
---simulator2Service
---simulator2Util
---simulator2Tests
---etc
所有父 pom 都有包装类型 - pom.所有最终模块都有资源生产类型——jar、war、sar 等。
根 pom 包含 dependencyManagement 部分,其中列出了所有子模块。
策略 1:
- 发布经理 RM(或任何人)合并来自 'feature' 的更新
分支机构
- 所有持续集成的事情都在发生(让他们没事)
- RM 在根上调用 mvn release:versionUpdate -DsetVersion=1.2
- 完成
策略 2:
RM 合并来自 'feature' 个分支的更新
所有持续集成的事情都在发生(让他们没事)
- RM 使用颠覆工具(git、svn 等)检查实际受到影响的模块
- RM 手动增加受影响模块的版本
- 完成
策略1:
好处:
- 没有人手动输入(可能除了版本号)
- pom 配置简单且统一,只能使用 dependencyManagement 部分在根 pom 上处理
- 所有模块的单一版本因此没有zoo of
模块版本
- 无需依赖必须检查位置的外部工具
实际更新(或更糟 - 取决于 RM 注意力)
- 开发人员不受限制进行任何与以下内容无关的更改
他们的模块(f.e。如果你添加新行或
不小心 运行 IDE)
中的自动格式化工具
缺点:
- 将更新实际上没有的模块版本
受影响 - 因此 HDD 可能存在问题 space
策略二:
好处:
- 将是实际更新的模块的更新版本
缺点:
- zoo 版本。 dao_1.2 取决于 domain_1.52,两者都取决于
etc_1.639模块
- 手动输入
- 依赖必须检查实际更新的外部工具
请分享您的意见。在大型项目中如何处理这个问题,例如弹簧框架
就我个人而言,我将绝对支持您的策略 1。这是我工作的公司使用的策略。与 "versions zoo".
相比,您提到的 HDD space 或升级不需要升级的模块版本的副作用是小问题
只有在你使用OSGI架构的情况下我才会投票给你的策略2,这需要非常精确的模块版本控制策略,如果你一次升级所有版本,它会破坏OSGI的大好处(仅热部署需要更新的 modules/submodules。
我还建议你看看 http://java.dzone.com/articles/why-i-never-use-maven-release,它给出了如何在多模块 maven 项目中升级版本以及如何在任何 CVS 中进行跟踪的很好提示
给定:多模块 Maven 项目
任务:每次发布后更新版本
我看到两种不同的策略:
策略 1 - 整个更新:更新所有模块的版本,不管是否有更新
策略 2 - 简约更新:仅更新实际受影响的那些模块的版本
假设我们有以下项目结构:
root
---dao
---domain
---web
---site1
---site2
---processors
---processor1
---processor1Service
---processor1Util
---processor1Tests
---processor2
---processor2Service
---processor2Util
---processor2Tests
---simulators
---simulator1
---simulator1Service
---simulator1Util
---simulator1Tests
---simulator2
---simulator2Service
---simulator2Util
---simulator2Tests
---etc
所有父 pom 都有包装类型 - pom.所有最终模块都有资源生产类型——jar、war、sar 等。 根 pom 包含 dependencyManagement 部分,其中列出了所有子模块。
策略 1:
- 发布经理 RM(或任何人)合并来自 'feature' 的更新 分支机构
- 所有持续集成的事情都在发生(让他们没事)
- RM 在根上调用 mvn release:versionUpdate -DsetVersion=1.2
- 完成
策略 2:
RM 合并来自 'feature' 个分支的更新
所有持续集成的事情都在发生(让他们没事)
- RM 使用颠覆工具(git、svn 等)检查实际受到影响的模块
- RM 手动增加受影响模块的版本
- 完成
策略1:
好处:
- 没有人手动输入(可能除了版本号)
- pom 配置简单且统一,只能使用 dependencyManagement 部分在根 pom 上处理
- 所有模块的单一版本因此没有zoo of 模块版本
- 无需依赖必须检查位置的外部工具 实际更新(或更糟 - 取决于 RM 注意力)
- 开发人员不受限制进行任何与以下内容无关的更改 他们的模块(f.e。如果你添加新行或 不小心 运行 IDE) 中的自动格式化工具
缺点:
- 将更新实际上没有的模块版本 受影响 - 因此 HDD 可能存在问题 space
策略二:
好处:
- 将是实际更新的模块的更新版本
缺点:
- zoo 版本。 dao_1.2 取决于 domain_1.52,两者都取决于 etc_1.639模块
- 手动输入
- 依赖必须检查实际更新的外部工具
请分享您的意见。在大型项目中如何处理这个问题,例如弹簧框架
就我个人而言,我将绝对支持您的策略 1。这是我工作的公司使用的策略。与 "versions zoo".
相比,您提到的 HDD space 或升级不需要升级的模块版本的副作用是小问题只有在你使用OSGI架构的情况下我才会投票给你的策略2,这需要非常精确的模块版本控制策略,如果你一次升级所有版本,它会破坏OSGI的大好处(仅热部署需要更新的 modules/submodules。
我还建议你看看 http://java.dzone.com/articles/why-i-never-use-maven-release,它给出了如何在多模块 maven 项目中升级版本以及如何在任何 CVS 中进行跟踪的很好提示