我有一个多模块Maven项目,父项目 P
和三个子模块 A
, B
和 C
. B
和 C
都是战争项目,都依赖于 A
.
我可以在 P
中键入 mvn compile
并正确编译所有子模块 . 当我想为特定模块进行操作时,就会出现问题 .
我希望能够为项目 B
打包一个战争,但是当我从 B
's directory, it complains that it can'运行包命令时,找到 A
的依赖项 .
我从这个问题中理解:Maven and dependent modules或许Maven并不是真的设计用于这种类型的依赖解析,但这引出了如何打包 B
的问题?
-
当我真的只想要
B
时,我是否必须为整个项目层次结构运行mvn package
? -
每次要打包
B
时,是否必须将A的快照安装到本地存储库中?
当 A
仍在积极开发中时,第二种情况并不是很有趣 .
这里有什么最佳做法?
5 回答
使用Maven advanced reactor options,更具体地说:
所以只需
cd
进入父P目录并运行:这将构建B和B所需的模块 .
Maven绝对是为这种类型的依赖而设计的 .
mvn package
将不会在您的本地存储库中安装任何内容,它只是打包项目并将其保留在目标文件夹中 .在父项目(A)中执行
mvn install
,所有子模块都将安装在您的计算机的Maven存储库中,如果没有更改,您只需编译/打包子模块(B),Maven将采用已经打包和安装的依赖项恰到好处 .如果更新了部分代码,则只需要在父项目中使用
mvn install
.如果您之前在项目B上运行 mvn install ,它将已安装到您的本地存储库,因此在构建程序包时,Maven可以解析依赖项 . 因此,只要每次更改项目B时都安装项目B,项目A的构建将是最新的 .
您可以使用聚合器pom定义多模块项目以构建一组项目 .
值得一提的是m2eclipse,它将Maven集成到Eclipse中,并允许您(可选)解析工作区中的依赖项 . 因此,如果您正在攻击多个项目,则工作区内容将用于编译 . 一旦您对更改感到满意,请运行mvn install(依次在每个项目上,或使用聚合器)将它们放在本地存储库中 .
看看我的回答Maven and dependent modules .
Maven Reactor plugin旨在处理项目的构建部分 .
你想要使用它的特定目标
reactor:make
.你说你“真的只想要B”,但这是假的 . 你想要B,但如果有任何变化,你也想要更新的A(“主动开发”) .
因此,有时您希望使用A,B和C.对于这种情况,您有聚合器项目P.对于您想要使用A和B(但不想要C)的情况,您应该创建聚合器项目Q .
编辑2016:以上信息可能与2009年相关 . 截至2016年,我强烈建议在大多数情况下忽略这一点,并简单地使用
-am
或-pl
命令行标志,如接受的答案中所述 . 如果您在v2.1之前使用的是maven版本,请先更改:)