【问题标题】:Maven - 'all' or 'parent' project for aggregation?Maven - 聚合的“全部”或“父”项目?
【发布时间】:2011-02-18 17:58:21
【问题描述】:

出于教育目的,我设置了这样的项目布局(为了更好地适应 eclipse):

-product
 |
 |-parent
 |-core
 |-opt
 |-all

Parent 包含一个带有 core、opt 和 all 的聚合项目。核心实现了应用程序的强制部分。 Opt 是可选部分。 All 应该将 core 与 opt 结合起来,并将这两个模块列为依赖项。

我现在正在尝试制作以下工件:

  1. product-core.jar
  2. product-core-src.jar
  3. product-core-with-dependencies.jar
  4. product-opt.jar
  5. product-opt-src.jar
  6. product-opt-with-dependencies.jar
  7. product-all.jar
  8. product-all-src.jar
  9. product-all-with-dependencies.jar

它们中的大多数都相当容易制作。不过,我确实对聚合工件有一些问题。我已经设法在“all”模块中使用自定义程序集描述符制作了 product-all-src.jar,该模块下载了所有非传递 deps 的源代码,并且效果很好。这种技术还允许我制作 product-all-with-dependencies.jar。

然而,我最近发现您可以使用源插件中的 source:aggregate 目标来聚合整个聚合项目的源。对于 javadoc 插件也是如此,它也通过父项目的使用进行聚合。

所以我在我的“所有”模块方法和放弃“所有”模块并只使用“父”模块进行所有聚合之间纠结。在“父级”中产生一些聚合工件,而在“全部”中产生其他工件感觉不干净。有没有办法在父项目中制作“product-all”jar,或者在“all”项目中聚合 javadoc?还是应该两个都保留?

谢谢

【问题讨论】:

    标签: java maven-2 aggregate maven maven-assembly-plugin


    【解决方案1】:

    扁平树不再经常使用。这是几年前为了处理 Eclipse 如何处理项目以及缺乏良好的 Maven 和 Eclipse 集成而完成的。如果您使用 m2eclipse 将 Maven 项目导入到 Eclipse 中,那么对于典型的 maven 嵌套树将不会有任何问题。

    关于如何构建 Maven 构建的好例子是什么? Maven 项目源itself。它包含您想要的所有部分,包括打包捆绑包的最终assembly

    典型的嵌套结构具有自上而下的层次结构,其中父级对其下的模块进行聚合,子级从父级继承值。虽然这些可以而且有时是分开的,但这不是常态。

    【讨论】:

    • 感谢您的提示。我刚刚看了看,似乎 Maven 源代码遵循了我建议的总体布局,但是没有像您指出的那样展平树。最终的程序集在 IMO 中不是很干净,它只是对 '../' 目录中的所有源文件执行正则表达式 grep,如果你想要来自 3:rd 方依赖项等的源文件,这并不容易。也不符合 javadoc 的方式聚合器工作(通过父项目)。似乎缺少我想要的功能,当我尝试一些时,我会尝试在这里写一个替代方法。谢谢指点。
    • 顺便说一句,src 程序集可以在svn.apache.org/repos/asf/maven/maven-3/trunk/apache-maven/src/…找到
    【解决方案2】:

    我建议只保留“全部”的程序集描述符,将其移动到 parent/ 并相应地更改 parent/pom.xml,然后通过执行类似mvn -f parent/pom.xml assembly:assembly 的操作来创建该程序集。换句话说,是的,删除“all”的冗余项目,因为它只是复制“parent”已经在做的事情。

    附带说明,如果该项目是聚合项目而不仅仅是父 pom.xml,则“父”似乎是一个糟糕的命名选择。

    [编辑]

    虽然是一个更大的项目,但也许按照您的设想进行布局的项目是 apache camel 项目。在这里查看:http://camel.apache.org/source.html。有一个 parent/ 模块处理所有其他所有内容,以及一个用于在 apache-camel/ 中生成实际构建分布的单独模块(在 apache-camel/src//main/descriptors 中具有程序集描述符)。也许这会更有帮助。

    【讨论】:

    • 您是否建议我应该有一个父级,只有一个父级 pom,以及一个构建完整产品的“聚合”?您应该将“dependencyManagement”放在父级还是聚合中?你能推荐一个好的示例项目吗?
    • 基本上是的。如果您的“聚合”除了调用程序集描述符之外没有做任何事情,尽管不需要将它放在单独的模块中。这可以与顶级 pom 一起使用(可能不像我最初建议的那样与父级一起使用)。 应该与父 pom 一起使用。如果你有很多复杂的聚合(比如……为 Windows、Linux 和 OSX 单独构建),那么这些聚合应该在单独的模块中。在你的情况下,这听起来就像一个简单的组装就可以了。
    • 很抱歉把这个拖了出来,但是你如何为一个聚合项目制作一个完整的jar?如果不创建“全部”项目,我似乎无法弄清楚如何做到这一点。
    • 如果我理解正确的话,你创建了'pom'类型的父项目,以及'jar'类型的win、linux和osx聚合项目。但是如何制作包含其子模块的所有二进制文件的 win jar?
    • 和本文一样 - 建立了一个单独的 dist 项目,而不是从聚合项目中完成组装:rombertw.wordpress.com/2010/05/14/…
    猜你喜欢
    • 2011-03-13
    • 2019-02-11
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多