Maven模块+构build一个特定的模块

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

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

我想能够打包一个项目B的战争,但是当我从B的目录运行包命令,它抱怨说,它找不到A的依赖关系。

我从这个问题中了解到: Maven和依赖模块 ,也许Maven并不是真正为这种types的依赖解决而devise的,但是这引出了如何打包B

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

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

A还处于积极的发展阶段时,第二种情况并不是很有趣。

这里有什么最佳实践?

这里有什么最佳实践?

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

这将构buildB和B所需的模块。

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

mvn package不会在你的本地仓库中安装任何东西,它只是打包项目并将其保留在目标文件夹中。

如果mvn install没有修改,你只需要编译/打包子模块(B),Maven将把它mvn install在父项目(A)中,所有这些子模块都将被安装在你的计算机的Maven仓库中已经打包并安装了依赖关系。

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

如果你之前在项目B上运行了mvn install ,它将被安装到你的本地仓库,所以当你生成包时,Maven可以解决依赖关系。 所以只要你每次更改它就安装项目B,你的项目A的版本将是最新的。

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

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

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

Maven Reactor插件旨在处理构build项目的一部分。

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

你说你“真的只想要B”,但这是错误的。 你想要B,但是你也想要一个更新的A,如果它有任何改变(“积极的发展”)。

所以,有时候你想和A,B和C一起工作。对于这种情况,你有聚合器项目P.对于你想使用A和B(但不想C)的情况,你应该创build聚合器项目Q 。

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