【问题标题】:Maven Modules + Building a Single Specific ModuleMaven 模块 + 构建单个特定模块
【发布时间】:2010-11-09 23:39:00
【问题描述】:

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

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

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

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

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

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

A 仍在积极开发中时,第二个场景并不好玩。

这里有什么最佳实践吗?

【问题讨论】:

    标签: java maven-2 build-process


    【解决方案1】:

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

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

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

    【讨论】:

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

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

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

    在父项目(A)中做mvn install,所有子模块都将安装在您计算机的Maven存储库中,如果没有更改,您只需要编译/打包子模块(B)和maven会把已经打包安装好的依赖拿来就好了。

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

    【讨论】:

    • 这将是开发过程中的一场噩梦,一旦您在子模块中进行修复,您将安装它,然后启动 servlet 容器。人生苦短:(
    【解决方案3】:

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

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

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

    【讨论】:

    • Grmphh... 那么我最终会得到与项目一样多的聚合器项目。
    【解决方案4】:

    看看我的回答Maven and dependent modules

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

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

    【讨论】:

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

    这里有什么最佳实践吗?

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

    如此处所述:

    【讨论】:

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

    假设父 pom.xml 包含 6 个模块,您要运行 ABF

    <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 将检查我们反应器中的所有项目以找到依赖于特定项目的项目。它会自动构建这些项目,而不是其他任何东西。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 2018-09-17
      • 1970-01-01
      • 2010-12-09
      • 2015-01-23
      • 2012-05-06
      • 2014-03-03
      • 2011-07-24
      相关资源
      最近更新 更多