ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

我从这个问题中了解到:Maven and dependent modules 也许 Maven 并不是真正为这种依赖解析而设计的,但这引出了我如何打包 B 的问题?

当我真的只想要 B 时,是否必须为整个项目层次结构运行 mvn package?每次我想打包 B 时,我是否必须将 A 的快照安装到我的本地存储库中?

A 仍处于积极开发阶段时,第二个场景并不有趣。

这里有什么最佳实践吗?


M
Manuel Jordan

这里有什么最佳实践吗?

更具体地说,使用 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 多项目构建中构建的模块列表


对于 2011 年访问此页面的任何人来说,这是更好的答案。现在 Maven 本身(Maven 2.1 及更高版本)对多模块提供了更好的支持,您不需要使用反应器插件。
另一个非常有用的选项是“-amd, --also-make-dependents”,它构建了所有依赖于 reactor 列表中项目的模块。
建立一个孙子模块怎么样?
@Bax,使用 mvn install -pl .,parent/child,parent/child/grandchild 使用逗号分隔多个项目和 .对于父母 pom
在您引用的文档中以及在一般的 Maven 中,“模块”和“项目”这两个术语是否用于同一事物?
W
Waqas Ahmed

假设 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 将检查我们反应器中的所有项目以找到依赖于特定项目的项目。它将自动构建这些项目,仅此而已。


v
victor hugo

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

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

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

如果您更新了代码的某些部分,您只需要在父项目中添加一个 mvn install


这将是开发过程中的一场噩梦,一旦您在子模块中进行修复,您将安装它,然后启动 servlet 容器。生命短暂 :(
A
Anirudh Ramanathan

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

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

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


有没有一种简单的方法可以保证我的目标项目的所有依赖项目都已安装?我拥有的层次结构实际上比这里描述的要复杂得多,因此请记住我是否已经为每个依赖项目运行 mvn install ,因为我上次进行了代码更改可能会很棘手。
是的,使用模块来构建项目集,请参阅添加到原始答案的链接。
C
Community

看看我的回答Maven and dependent modules

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

您想要使用它的特定目标reactor:make


这曾经是正确的答案,但在 Maven 2.1 中,您不再需要使用 reactor 插件。查看 Pascal 在此线程中与“高级反应器选项”相关的答案
Z
Zac Thompson

你说你“真的只是想要 B”,但这是错误的。您需要 B,但如果 A 有任何更改(“积极开发”),您还需要更新的 A。

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

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


Grmphh ...那么我最终会得到与项目一样多的聚合器项目。
u
umunBeing

您使用以下命令编译、打包、清理特定模块:

mvn <target> -pl <MODULE> -am

使用 -pl 指定模块或项目名称

-am 也是 make。