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

时间:2009-07-11 16:12:06

标签: java maven-2 build-process

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

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

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

我从这个问题中理解:Maven and dependent modules或许Maven并不是真的设计用于这种类型的依赖解析,但这引出了如何打包B的问题?

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

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

  3. A仍在积极开发中时,第二种情况并不是很有趣。

    这里有哪些最佳做法?

6 个答案:

答案 0 :(得分:578)

  

这里有哪些最佳做法?

使用Maven advanced reactor options,更具体地说:

-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

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:5)

看看我的回答Maven and dependent modules

Maven Reactor plugin旨在处理项目的构建部分。

您希望使用它的特定目标reactor:make

答案 4 :(得分:3)

你说你“真的只想要B”,但这是假的。你想要B,但如果有任何变化,你也想要更新的A(“主动开发”)。

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

编辑2016 :上述信息可能与2009年相关。截至2016年,我强烈建议在大多数情况下忽略此信息,只需使用-am-pl命令行标志,如接受的答案中所述。如果您使用的是v2.1之前的maven版本,请先更改:)

答案 5 :(得分:0)

说父pom.xml包含6个模块,您要运行 A B 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

OR

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

OR

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

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

-am 命令使特定项目在多模块构建中需要的所有项目都在 -amd 中进行,同时- make-dependents 选项将Maven配置为构建一个项目以及任何依赖于该项目的项目。使用-make-make-dependents 时,Maven将检查反应堆中的所有项目,以找到依赖于特定项目的项目。它将自动构建那些项目,而无需执行其他任何操作。