Maven模块+构建单个特定模块

我有一个多模块Maven项目,父项目P和三个子模块ABCBC都是战争项目,它们都依赖于A

我可以在P中输入mvn compile,并正确编译所有子模块。当我想对特定模块进行操作时,问题就来了。

我希望能够为项目B打包战争,但是当我从B的目录运行package命令时,它抱怨无法找到A的依赖项。

我从这个问题中了解到:Maven和依赖模块可能Maven并不是为这种类型的依赖项解决而设计的,但这就引出了如何打包B的问题?

  1. 当我真的只想要B时,我必须为整个项目层次运行mvn package吗?

  2. 每次我想打包B时,我都必须将A的快照安装到本地存储库中吗?

A仍处于积极开发阶段时,第二种情况并不有趣。

这里有什么最佳实践吗?

346708 次浏览

如果你之前在项目B上运行了mvn install,它将被安装到你的本地存储库中,所以当你构建包A时,Maven可以解决依赖关系。因此,只要您安装项目B,每次更改它,您的项目A的构建将是最新的。

您可以使用聚合器pom定义一个多模块项目,以构建一组项目。

m2eclipse也值得一提,它将Maven集成到Eclipse中,并允许你(可选地)从工作空间解析依赖项。因此,如果您正在处理多个项目,那么工作区内容将用于编译。一旦对更改感到满意,运行mvn install(依次在每个项目上运行,或使用聚合器),将它们放入本地存储库中。

Maven就是为这种类型的依赖而设计的。

mvn package不会在本地存储库中安装任何东西,它只是打包项目并将其留在目标文件夹中。

在父项目(A)中执行mvn install,这样所有的子模块都将安装在你的计算机的Maven存储库中,如果没有任何更改,你只需要编译/打包子模块(B), Maven将采用已经打包和安装的依赖项。

如果你更新了部分代码,你只需要在父项目中mvn install

你说你“真的只想要B”,但这是错误的。您想要B,但是如果A有任何更改(“活动开发”),您还想要一个更新的A。

因此,有时你想要使用A、B和C,对于这种情况,你有聚合器项目p。对于你想要使用A和B(但想要C)的情况,你应该创建聚合器项目Q。

编辑2016:上述信息在2009年可能是相关的。截至2016年,我强烈建议在大多数情况下忽略这一点,并简单地使用-am-pl命令行标志,就像接受的答案中描述的那样。如果您使用的是v2.1之前的maven版本,请先更改它:)

看看我的答案Maven和依赖模块

Maven反应堆插件被设计用来处理项目的构建部分。

你想要使用它的特定目标reactor:make

这里有什么最佳实践吗?

更具体地说,使用Maven先进反应堆方案:

-pl, --projects
Build specified reactor projects instead of all projects
-am, --also-make
If project list is specified, also build projects required by the list

所以只需将cd放入父P目录并运行:

mvn install -pl B -am

这样就可以构建B和B所需的模块。

注意,如果引用的artifactId与目录名不同,则需要使用冒号:

mvn install -pl :B -am

如下所述:

假设父pom.xml包含6个模块,你想运行一个BF

<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>D</module>
<module>E</module>
<module>F</module>
</modules>

1- CD到父项目

 mvn --projects A,B,F --also-make clean install

mvn -pl A,B,F -am clean install

mvn -pl A,B,F -amd clean install

注意:当你用选项指定一个项目时,Maven将构建指定项目所依赖的所有项目(直接或间接)。Maven将检查项目列表并遍历依赖关系树,找到它需要构建的所有项目。

虽然命令在多模块构建中构建特定项目所需的所有项目,但amd——also-make-dependents选项配置Maven构建一个项目和依赖于该项目的任何项目。当使用——also-make-dependents时,Maven将检查反应堆中的所有项目,以找到依赖于特定项目的项目。它将自动构建这些项目,而不是其他任何项目。

编译、打包、清理特定模块使用以下命令:

mvn <target> -pl <MODULE> -am
  • 使用-pl指定模块或项目名称
  • -am也是make。