我有一个包含父项目P
的多模块Maven项目和三个子模块A
,B
和C
。 B
和C
都是战争项目,都依赖于A
。
我可以在mvn compile
中键入P
并正确编译所有子模块。当我想为特定模块进行操作时,问题出现了。
我希望能够为项目B
打包一个war,但是当我从B
的目录运行package命令时,它会抱怨它找不到依赖项A
。
我从这个问题中理解:Maven and dependent modules或许Maven并不是真的设计用于这种类型的依赖解析,但这引出了如何打包B
的问题?
当我真的只想要mvn package
时,是否必须为整个项目层次结构运行B
?
每次要打包B
时,是否必须将A的快照安装到本地存储库中?
当A
仍在积极开发中时,第二种情况并不是很有趣。
这里有哪些最佳做法?
答案 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
答案 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)
答案 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将检查反应堆中的所有项目,以找到依赖于特定项目的项目。它将自动构建那些项目,而无需执行其他任何操作。