我有一个多模块 Maven 项目,其中包含一个父项目 P
和三个子模块 A
、B
和 C
。 B
和 C
都是战争项目,都依赖于 A
。
我可以在 P
中输入 mvn compile
并正确编译所有子模块。当我想对特定模块进行操作时,问题就来了。
我希望能够为项目 B
打包一个战争,但是当我从 B
的目录运行打包命令时,它抱怨它找不到 A
的依赖项。
我从这个问题中了解到:Maven and dependent modules 也许 Maven 并不是真正为这种依赖解析而设计的,但这引出了我如何打包 B
的问题?
当我真的只想要 B 时,是否必须为整个项目层次结构运行 mvn package?每次我想打包 B 时,我是否必须将 A 的快照安装到我的本地存储库中?
当 A
仍处于积极开发阶段时,第二个场景并不有趣。
这里有什么最佳实践吗?
这里有什么最佳实践吗?
更具体地说,使用 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
如此处所述:
定义将在 Maven 多项目构建中构建的模块列表
假设 Parent 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
或者
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 将检查我们反应器中的所有项目以找到依赖于特定项目的项目。它将自动构建这些项目,仅此而已。
Maven 绝对是为这种类型的依赖而设计的。
mvn package
不会在您的本地存储库中安装任何东西,它只是将项目打包并将其保留在目标文件夹中。
在父项目 (A) 中执行 mvn install
,所有子模块都将安装在您计算机的 Maven 存储库中,如果没有更改,您只需要编译/打包子模块 (B),Maven 将采取已经打包和安装的依赖项刚刚好。
如果您更新了代码的某些部分,您只需要在父项目中添加一个 mvn install
。
如果您之前在项目 B 上运行过 mvn install ,它将已安装到您的本地存储库中,因此当您构建包 A 时,Maven 可以解决依赖关系。因此,只要每次更改项目 B 时都安装它,项目 A 的构建就会是最新的。
您可以使用聚合器 pom 定义一个多模块项目来构建一组项目。
还值得一提的是 m2eclipse,它将 Maven 集成到 Eclipse 中,并允许您(可选地)从工作区解析依赖关系。因此,如果您要破解多个项目,工作区内容将用于编译。对更改感到满意后,运行 mvn install(依次在每个项目上,或使用聚合器)将它们放入本地存储库。
看看我的回答Maven and dependent modules。
Maven Reactor plugin 旨在处理项目的构建部分。
您想要使用它的特定目标reactor:make
。
你说你“真的只是想要 B”,但这是错误的。您需要 B,但如果 A 有任何更改(“积极开发”),您还需要更新的 A。
因此,有时您想使用 A、B 和 C。对于这种情况,您有聚合器项目 P。对于要使用 A 和 B(但不想要 C)的情况,您应该创建聚合器项目 Q .
2016 年编辑:上述信息可能与 2009 年有关。截至 2016 年,我强烈建议在大多数情况下忽略这一点,而只需使用 -am
或 -pl
命令行标志,如接受的答案。如果您使用的是 v2.1 之前的 maven 版本,请先更改它 :)
您使用以下命令编译、打包、清理特定模块:
mvn <target> -pl <MODULE> -am
使用 -pl 指定模块或项目名称
-am 也是 make。
不定期副业成功案例分享
mvn install -pl .,parent/child,parent/child/grandchild
使用逗号分隔多个项目和 .对于父母 pom