【问题标题】:Managing Maven multimodule build while inheriting from parent pom从父 pom 继承时管理 Maven 多模块构建
【发布时间】:2012-12-31 17:07:54
【问题描述】:

简而言之,我想做的是一次构建一堆库和应用程序,所有 Maven 项目。据我了解,在mvn package 的一个命令行运行中完成此任务的一种方法是创建一个多模块项目,该项目将列出我想要构建的每个模块,将它们放入 Maven 反应器中,然后构建。

按照 Maven 书中的示例,通常多模块 pom 位于各个模块上方的目录中。但是,通常情况下,父 pom 位于模块上方的目录中,这引发了一个问题,通常情况下,多模块构建也应该是父目录吗?我想不是;但是我想知道为什么我会遇到这个有趣的设计怪癖。

所以,我想知道设置它的正确方法。我看到以下约定/要求:

  • 多模块pom 必须知道其他模块在磁盘上的位置。由于它实际上是从源代码进行构建,因此不能简单地依赖已安装的版本(因为它正在安装它们!)
  • 父级实际上不必是物理目录,尽管这样会更好。我认为这是最好打破的惯例。
  • 实际上,各个库/应用程序甚至不需要知道它们是作为多模块构建的一部分构建的。

这通常在多模块构建中如何设置?有没有更简单的方法来管理一次构建多个 Maven 项目?

【问题讨论】:

    标签: java maven pom.xml


    【解决方案1】:

    我将所有单独的模块放在根模块中。 Some software 有多层层次结构的问题。

    要使子模块在同一级别引用它的父模块:

    <parent>
        <groupId>com.domain</groupId>
        <artifactId>xyz</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../xyz/pom.xml</relativePath>
    </parent>
    

    我建议你不要在多模块中放置任何单个模块需要继承的东西(例如属性)。如果这样做,您将无法独立构建其他模块。

    【讨论】:

    • +1 我发现 Eclipse 存在嵌套模块的性能问题。
    • 如果您在解决模块间依赖关系时遇到问题,而不是您的多模块构建是错误的。
    • Also realize that inter-module dependencies are resolved using the local repository (not target directories). - 从 Maven 3 开始不正确。如果构建中的模块依赖于构建中的另一个模块,则将使用模块的构建目录来满足依赖关系。我无法立即找到相关文档,但在实践中很容易证明。
    • 你们说的都对。我测试了 mvn 包,效果很好。我删除了那部分答案。
    【解决方案2】:

    我什至会说这是“约定”的模糊部分。文档和常识都表明项目聚合(也称为多模块构建)和继承是为处理不同用例而提供的两种不同机制。

    同时,似乎有一个事实上的约定(是的,我知道)将项目聚合和继承父角色组合到一个 pom.xml 中。事实上,父声明的元素和项目聚合机制的模块元素似乎都在引导使用这种组合。

    就个人而言,我发现定期将父 pom 分离出来非常有用。而且我还发现在我的源代码管理中将父 pom 定位在一个完全分离的位置很有用,因此我的文件夹结构也是如此。但是,在源代码控制/文件夹结构中定位属于同一多模块构建结构的构建似乎很少有用。也许这甚至可以很好地衡量某些东西是否应该包含在同一个聚合构建中;如果它似乎值得在源文件夹结构中搭配,那么它可能是聚合的有力候选者。

    我唯一确定的是,这些东西值得花时间整理。在不创建整体构建结构方面出错可能会更好。 . .处理大量不必要的聚合父子构建模块非常困难。另一方面,聚合单个构建以一起运行是在更高级别提供的功能,例如 CI 构建服务器。所以,我想我可能会建议在更多独立性方面犯错。

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2012-12-22
      • 2012-03-17
      • 2013-02-23
      • 2012-04-13
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多