我目前正在优化多模块 Maven 项目的 Maven 构建。该项目由大约 90 个 Maven 模块组成。一般来说,有一些交叉库构成了核心,然后大约有 15 个“应用程序模块”构成了整个应用程序(然后将其部署为 WAR)
现在通常整个项目都有一个主版本“2.5”,所以当一个新的主版本完成时,所有“应用程序模块”都有相同的版本“2.5.0”。到现在为止还挺好。
如果一个模块有需要修复或改进的错误,则应该发布该“应用程序模块”的新版本。例如,模块 A 修复了一个错误,那么 A.jar 应该是“2.5.1”版本,而其余的应该仍然是“2.5.0”。
parent (2.5.0-SNAPSHOT
- 模块 A (2.5.1-SNAPSHOT)
- 模块 B (2.5.0-SNAPSHOT)
- 模块 C (2.5.2-SNAPSHOT)
- War (2.5.3-SNAPSHOT) <-- 最后是 3,因为 C 有 2 个重新发布,A 有一个,并且为了简单起见,在每个模块发布后发布。
我们决定在主 pom 中管理 Artifact 版本,因此我们不需要在发布一个模块后更新每个 Artifact 的依赖版本。
因此,现在每当一个更新的“应用程序模块”准备就绪时,我们使用 maven 发布插件来执行该模块的发布(我们发布的是一个模块,而不是整个项目)。因此,假设我们在 2.5.4 版本中发布模块 A,导致 A.jar 被部署为 2.5.4 版本,并通过将模块代码更新为 2.5.5-SNAPSHOT 来完成。
完成此操作后,我们需要更新主 pom 中的版本,以便所有模块继续引用正确的版本。
感谢主 pom 的 dependencyManagement 部分,如果我构建 War 模块,它会自动选择模块 A 的新版本。
现在到了棘手的部分:一旦所有模块都发布了,就应该发布新版本的 Web 应用程序。这应该包含所有未更改的模块以及刚刚发布的模块。我目前正在努力解决如何做到这一点。如果我依赖于父 poms 版本,则发布将包含 SNAPSHOT 版本(所有一个版本增量都太高),这是我和发布插件不允许的。
解决这个困境的最佳方案是什么?
我有一个想法将依赖管理外包给一个单独的 pom,然后使用“导入”范围将其导入主 pom 依赖管理。
这种情景是愚蠢的想法吗?除了开发和维护这样的大型多模块应用程序之外,还有其他选择吗?简单地让所有版本同步并在整个项目上使用发布插件并不是一个选择,因为应用程序很大并且客户端应用程序必须加载更新的模块版本。我们的一些客户的连接速度非常慢,因此每次推出所有模块都会让他们非常不高兴。
非常感谢帮助,
克里斯
最佳答案
首先,重要的是要意识到版本号虽然对依赖管理很重要,但完全是任意的。至少,版本号的形式是任意的(是的,我知道 the syntax for Maven version ranges ,我从未听说过有人使用它)。一些 OSS 项目完全避开“传统”版本号,仅使用 SVN 存储库版本或日期进行版本控制。
一种选择是没有“项目范围”的版本,而是允许每个组件具有不同的版本号。我觉得这是一个完全可以接受的解决方案。
另一种解决方案是使用快照依赖项发布。您不是“应该”这样做的,但没有什么能阻止您对快照版本进行硬编码(它非常冗长且带有时间戳)。无论如何,除了不可重复构建的幽灵之外,什么都没有。
如果您必须让所有组件具有相同的版本号,我建议将内部版本号合并到项目版本的次要组件中。
在这种方法中,您可以利用 Maven Build Number plugin区分版本中的增量版本,如以下问题所述:Can I set the project version with a buildnumber-maven-plugin? .
请注意,您只能在仅由您的构建服务器(或您的构建工程师)使用的“最终版本”配置文件中执行此操作。
Version Numbers plugin也是你在这里的 friend 。
最终的发布工作流程将类似于以下内容:
2.5.5-SNAPSHOT
开始. mvn versions:set -DnewVersion 2.5.5
. mvn deploy -Prelease
这会激活您的“发布配置文件”,将内部版本号添加到 Artifact finalName
. mvn versions:set -DnewVersion 2.5.5-SNAPSHOT
. 当你有一个真正的“主要”版本时,增加版本 2.5.6、2.6.0 等。
祝你好运!
关于maven - 创建一个多模块 Maven 构建和独立发布单个模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842501/