如何将多模块项目移动到maven

mda*_*win 11 java maven

我们正在尝试将多个模块应用程序移动到maven,并遇到一些问题.

每个模块都独立存储在cvs中.我们为每个应用程序提供了清单文件,列出了该应用程序所需的模块(以及可选的版本).并非所有模块都是maven形式.

因此,应用程序'customer_care'具有以下清单:

 <manifest>
 <module id="MY_api"/>
 <module id="custcare_webapp"/>
 </manifest>
Run Code Online (Sandbox Code Playgroud)

同样,应用程序"核心批处理"有一个这样的清单:

 <manifest>
 <module id="MY_api"/>
 <module id="core"/>
 <module id="batch"/><!--NB this is a non-maven module -->
 </manifest>
Run Code Online (Sandbox Code Playgroud)

我已经开始'mavenising'我们的代码,所以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>
Run Code Online (Sandbox Code Playgroud)

但是这个构建是不可重现的,因为MY_api中'centralconfig'依赖的版本是'RELEASE'.因此,如果有人发布了新版本的"centralconfig",那么下次我们构建这个冻结的清单时,就会有所不同.

那么为什么我们不使用像central-config这样的依赖关系的硬编码版本呢?因为那样,每当有人将centralconfig更新到新版本时,我们就必须更新10或20个pom文件.依赖于中央配置的所有东西,以及依赖于它的所有内容,都需要更新pom.xml并重新发布.这不仅是很多工作,我不知道如何以编程方式可靠地识别声明依赖于中央配置的每个模块.

可能的解决方案?

我可以在一个地方定义'centralconfig.version',然后在我的所有模块中引用它吗?如果是这样,我应该在哪里这样做?我对父母不太了解,但我觉得他们可能会提供解决方案.

更新

似乎使用父pom是可行的方法.但根据这个问题: maven项目可以有多个父母吗?,maven儿童项目不可能拥有多个父母.

那么,MY_api模块如何成为custcare_webapp和core_batch的子项?

更新

我已经得出结论,maven不符合我的要求,我们已经回到使用我们12年的本土解决方案构建使用ant和CVS.

spa*_*ead 1

我认为你确实需要一个父 POM。这是一个顶层pom.xml,只是一个 POM 模块,没有关联的代码。mvn您可以通过在此 上运行命令来构建整个项目pom.xml

POM 应该位于所有模块目录之上的目录中。也就是说,每个模块都将位于包含主模块的目录的子目录中pom.xml

该 POM 的<packaging>类型将为pom. 这意味着它是一个纯 POM 项目,没有自己的代码。它还将有一个标签,其中包含每个模块的<modules>一个元素。<module>这样,当您运行该mvn命令时,Maven 也会知道构建每个模块。这里有一个不错的父 POM 示例。

使用标准<dependencies>标签在此 POM 中设置所有依赖项。模块 POM 将继承它们。(更新:请参阅下面的评论,绝对值得探索该<dependencyManagement>标签而不是父 POM。)

最后,每个模块 POM 都应该引用主 POM。这样,如果您mvn在其中一个模块目录中运行(即您只是构建一个模块),它将向父级查找依赖项。您可以使用<parent> 标签来执行此操作,该标签将保存主 POM 的<groupid>和。这里有<artifactid>一个很好的标签示例<parent>,以及对多模块项目的全面回顾。