我们试图将几个多模块应用程序移植到Maven,并遇到了一些问题。
每个模块在cvs中都是独立存储的。我们为每个应用程序编写了清单文件,列出了该应用程序所需的模块(以及可选的版本)。并非所有模块都采用Maven格式。
因此,“customer_care”应用程序具有以下清单:
<manifest>
<module id="MY_api"/>
<module id="custcare_webapp"/>
</manifest>
同样,应用程序'core batch'有一个像这样的清单:
<manifest>
<module id="MY_api"/>
<module id="core"/>
<module id="batch"/><!--NB this is a non-maven module -->
</manifest>
我已经开始对我们的代码进行"Maven化",因此MY_api项目有一个pom.xml文件来定义依赖关系,其中包括对另一个内部代码模块"central_config"的依赖。我已经指定了版本RELEASE。
问题
这一切都运行良好,直到我需要创建一个冻结的清单。我可以为每个模块指定一个版本:
<manifest>
<module id="MY_api" version="0.123.0"/>
<module id="core" version="0.456.0"/>
<module id="batch" version="0.789.0"/><!--NB this is a non-maven module -->
</manifest>
但是这个构建过程无法再现,因为MY_api中'centralconfig'依赖的版本是'Release'。所以,如果有人发布了'centralconfig'的新版本,那么下次我们构建这个冰冻清单时,它就会不同。
那么为什么我们不使用像central-config这样的硬编码依赖版本呢?因为那样的话,每当有人更新centralconfig到新版本时,我们就需要更新可能有10到20个pom文件。所有依赖于central config的东西,以及依赖于它的一切,都需要更新他们的pom.xml并重新发布。这不仅是大量的工作,我也不知道如何程序化地可靠地识别每个声明了对central config依赖的模块。
一个可能的解决方案?
我可以在一个地方定义'centralconfig.version',然后在所有我的模块中引用它吗?如果可以的话,我应该在哪里做这个?我对父pom不太了解,但我觉得它们可能提供了一个解决方案。
更新
似乎使用父pom是正确的方法。但根据这个问题:Maven项目可以有多个父母吗?,一个Maven子项目不能有多个父母。
那么MY_api模块怎么能同时是custcare_webapp和core_batch的子模块呢?
更新
我得出结论,Maven不符合我的要求,我们已经回到使用ant和CVS构建我们12年前编写的自制解决方案。