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

560
我有一个包含父项目P和三个子模块ABC的多模块Maven项目。 BC都是war项目,且都依赖于A
我可以在P中键入mvn compile并正确编译所有子模块。但当我想对特定模块执行操作时就会出现问题。
我想为项目B打包一个war,但当我从B的目录中运行打包命令时,它会抱怨找不到A的依赖关系。
我从这个问题中了解到:Maven and dependent modules也许Maven并不真正设计用于此类依赖关系的解决,但这引出了一个问题,那么我该如何打包B呢?
  1. 当我只想要B时,我是否必须运行整个项目层次结构的mvn package

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

A仍在积极开发中时,第二种情况并不好玩。
这里有什么最佳实践吗?
7个回答

958

有什么最佳实践吗?

使用 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

所以只需进入父目录P并运行以下命令:

mvn install -pl B -am

这将构建B以及B所需的模块。

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

mvn install -pl :B -am

如下所述:


18
对于任何2011年访问此页面的人,这是更好的答案。现在,Maven本身对多模块有更好的支持(Maven 2.1及以上版本),您不需要使用reactor插件。 - Spedge
22
另一个非常有用的选项是"-amd,--also-make-dependents",它会构建与反应堆列表中的项目有依赖关系的所有模块。 - deterb
2
建立一个孙模块怎么样? - Bax
16
请使用命令mvn install -pl .,parent/child,parent/child/grandchild 进行操作。多个项目之间用逗号隔开,父POM使用点号表示。 - Neo
2
在您引用的文档和Maven中,"module"和"project"这两个术语是否用于同一事物? - Lii
显示剩余2条评论

93

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

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

1- 进入父项目的目录

 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

注意: 使用-am选项指定项目时,Maven将构建指定项目直接或间接依赖的所有项目。 Maven将检查项目列表并沿着依赖树向下遍历,找到它需要构建的所有项目。

-amd--also-make-dependents选项可以构建一个项目及其所依赖的任何项目,在多模块构建中使某个项目所需的所有项目都得到构建。当使用--also-make-dependents时,Maven将检查反应堆中的所有项目以查找依赖于特定项目的项目。它将自动构建这些项目,但不会构建其他项目。


15

Maven绝对是为这种依赖关系设计的。

mvn package不会在您的本地存储库中安装任何内容,它只会将项目打包并留在目标文件夹中。

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

如果您更新了代码的某些部分,只需在父项目中运行mvn install即可。


6
在开发过程中如果想象一下,在子模块做了修复后,需要进行安装并启动servlet容器,这将是一个噩梦。人生苦短 :( - hguser

12

如果您之前在项目B上运行过mvn install,那么它将被安装到您的本地仓库中,因此当您构建A项目时,Maven可以解析其依赖关系。只要每次更改项目B时都进行安装,您就可以保持对A项目的构建最新。

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

还值得一提的是m2eclipse,它将Maven集成到Eclipse中,并允许您(可选地)从工作区解析依赖项。因此,如果您正在同时处理多个项目,则工作区内容将用于编译。一旦您对更改感到满意,请运行mvn install(逐个对每个项目运行,或使用聚合器)将其放入本地仓库中。


2
有没有一种简单的方法来确保我的目标项目的所有依赖项目都已安装?实际上,我拥有的层次结构比这里描述的要复杂得多,因此尝试记住自上次进行代码更改以来是否为每个依赖项目运行了mvn install可能会很棘手。 - Brian Ferris
是的,使用模块来构建项目集,请参见原始答案中添加的链接。 - Rich Seller

6
你说你“只想要B”,但这是错误的。你想要B,但如果A有任何更新(“活跃开发”),你也想要更新后的A。
因此,有时你需要使用A、B和C。对于这种情况,你可以使用聚合项目P。对于你想要使用A和B(但不想要C)的情况,你应该创建聚合项目Q。
编辑2016:以上信息可能在2009年相关。截至2016年,我强烈建议在大多数情况下忽略这一点,并简单地使用如已接受答案中所述的-am-pl命令行标志。如果你正在使用v2.1之前的maven版本,请先进行更改 :)

2
Grmphh...那我最终会有和项目一样多的聚合器项目。 - Kris

6

5
以前这是正确的答案,但是在Maven 2.1版本中,您不再需要使用reactor插件。请参考帖子中Pascal关于“高级反应堆选项”的回答。 - Spedge

5
你可以使用这个命令来编译、打包和清理特定模块:

```

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接