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


382

我有一个父项目多模块Maven项目P和三个子模块ABC。这两个BC是战项目,都依赖于A

我可以输入mvn compileP和拥有所有的子模块正确的编译的。当我要对特定模块进行操作时,问题就来了。

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

我从这个问题中了解到:Maven和相关模块,也许Maven并不是真正为这种类型的依赖关系解析而设计的,但这引出了我应该如何打包的问题B

  1. mvn package当我真的想要时,是否必须为整个项目层次结构运行B

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

A仍在积极开发中时,第二种情况就不好玩了。

这里有最佳做法吗?


Answers:


694

这里有最佳做法吗?

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

如此处所述:https : //stackoverflow.com/a/26439938/480894


15
对于在2011年访问此页面的任何人来说,这都是更好的答案。现在,maven本身(Maven 2.1及更高版本)中对多模块有了更好的支持,您无需使用反应堆插件。
承诺

17
另一个非常有用的选项是“ -amd,-also-make-dependents”,它根据反应堆列表中的项目构建所有模块。
2011年

1
如何构建孙子模块呢?
Bax

12
@Bax,使用mvn install -pl .,parent/child,parent/child/grandchild 使用逗号分隔多个项目和。为父pom
Neo

1
当我以clean package这种方式尝试使用模块时,它无法解决尚未安装的反应堆依赖性。有了-am它将不必要地重建部门。
盆地

18

说家长的pom.xml包含6个模块,并且你想运行一个˚F

<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

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

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


8

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

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

不要mvn install在父项目(A),这一切的子模块将被安装在您的计算机的Maven仓库,如果没有,你只需要编译/打包子模块(B)和Maven将已经打包的变化并正确安装了依赖项。

mvn install如果您更新了部分代码,则只需在父项目中添加一个即可。


3
在开发过程中,这将是一场噩梦,一旦您在子模块中进行了修复,就必须先安装它,然后再启动Servlet容器。人生

7

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

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

还值得一提的是m2eclipse,它将Maven集成到Eclipse中,并允许您(可选)解决工作区中的依赖项。因此,如果您要分散多个项目,则将使用工作区内容进行编译。对更改满意后,请运行mvn install(依次在每个项目上,或使用聚合器)将其放入本地存储库中。


1
有没有一种简单的方法可以确保已安装目标项目的所有从属项目?我拥有的层次实际上比这里描述的复杂得多,因此请记住自从我上次进行代码更改以来,是否已经为每个相关项目运行了mvn install。
Brian Ferris

是的,使用模块来构建项目集,请参阅添加到原始答案的链接。
Rich Seller 2009年

5

看看我的答案Maven和相关模块

Maven的Reactor插件旨在应对建设项目的一部分。

您将要使用的特定目标reactor:make


3
这曾经是正确的答案,但是使用Maven 2.1,您不再需要使用反应堆插件。看看Pascal在该主题中有关“高级反应堆选项”的答案
Spedge 2011年

3

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

因此,有时您想使用A,B和C。在这种情况下,您有聚合器项目P。对于要使用A和B(但希望使用C)的情况,应创建聚合器项目Q 。

编辑2016年:上面的信息可能与2009年有关。从2016年开始,我强烈建议在大多数情况下忽略此信息,并按照接受的答案中所述简单地使用-am-pl命令行标志。如果您使用的是v2.1之前的Maven版本,请先进行更改:)


Grmphh ...然后,我将完成与项目一样多的聚合器项目。
克里斯(Kris)

@Kris我不再推荐这个。如果有人仍然想知道如何,我将其保留在这里,但是我现在总是使用-am和-pl标志。我已经更新了答案。
扎克·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.