在多项目构建中,似乎有几种方法可以构造父POM,我想知道是否有人对每种方法的优缺点有什么 idea .

拥有父POM的最简单方法是将其放在项目的根中,即

myproject/
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml

其中,pom.xml既是父项目,也描述了-core-api和-app模块

下一种方法是将父目录分离到它自己的子目录中,如中所示

myproject/
  mypoject-parent/
    pom.xml
  myproject-core/
  myproject-api/
  myproject-app/

父pom仍然包含模块,但它们是相对的,例如/我的项目核心

最后,还有一个选项,将模块定义和父级分开,如下所示

myproject/
  mypoject-parent/
    pom.xml
  myproject-core/
  myproject-api/
  myproject-app/
  pom.xml

父pom包含任何"共享"配置(dependencyManagement、properties等)和myproject/pom.xml包含模块列表.

其目的是可扩展到大规模构建,因此应可扩展到大量项目和工件.

一些额外的问题:

  • 哪里是定义各种共享配置的最佳位置,如源代码管理、部署目录、公共插件等(我假设是父级的,但我经常被这一点困扰,它们最终出现在每个项目中,而不是一个公共项目中).
  • maven-release插件、hudson和nexus如何处理如何设置多项目(可能是一个很大的问题,如果有人被多项目构建是如何设置所困扰的,那就更多了)?

编辑:每个子项目都有自己的pom.xml,为了保持简洁,我省略了它.

推荐答案

在我看来,要回答这个问题,您需要从项目生命周期和版本控制的Angular 来考虑.换句话说,父POM是否有自己的生命周期,即它是否可以独立于其他模块发布?

如果答案是yes(这是问题或 comments 中提到的大多数项目的情况),那么从VCS和Maven的Angular 来看,家长pom需要他自己的模块,你最终会在VCS级别得到类似的结果:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
`-- projectA
    |-- branches
    |-- tags
    `-- trunk
        |-- module1
        |   `-- pom.xml
        |-- moduleN
        |   `-- pom.xml
        `-- pom.xml

这让 checkout 有点痛苦,通常的处理方法是使用svn:externals.例如,添加trunks目录:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|       |-- module1
|       |   `-- pom.xml
|       |-- moduleN
|       |   `-- pom.xml
|       `-- pom.xml
`-- trunks

具有以下外部定义:

parent-pom http://host/svn/parent-pom/trunk
projectA http://host/svn/projectA/trunk

签出trunks将导致以下局部 struct (模式#2):

root/
  parent-pom/
    pom.xml
  projectA/

或者,您甚至可以在trunks目录中添加pom.xml:

root
|-- parent-pom
|   |-- branches
|   |-- tags
|   `-- trunk
|       `-- pom.xml
|-- projectA
|   |-- branches
|   |-- tags
|   `-- trunk
|       |-- module1
|       |   `-- pom.xml
|       |-- moduleN
|       |   `-- pom.xml
|       `-- pom.xml
`-- trunks
    `-- pom.xml

这个pom.xml是一种"假的"POM:它从来没有发布过,它不包含真正的版本,因为这个文件从来没有发布过,它只包含一个模块列表.对于此文件,检出将产生此 struct (模式#3):

root/
  parent-pom/
    pom.xml
  projectA/
  pom.xml

这种"黑客"允许在签出后从根目录启动react 堆构建,使事情变得更加方便.实际上,我喜欢这样设置maven项目和large builds个VCS存储库:它工作正常,可扩展性好,提供了您可能需要的所有灵活性.

如果答案是no(回到最初的问题),那么我认为你可以接受模式#1(做可能可行的最简单的事情).

现在,关于 prize 问题:

  • 哪里是定义各种共享配置的最佳位置,如源代码管理、部署目录、通用插件等.(我假设是父母,但我经常被这一点咬住,他们最终出现在每个项目中,而不是一个共同的项目中).

老实说,我不知道如何不在这里给出一个概括性的答案(比如"使用你认为有意义的水平来实现共同的事情").无论如何,子POM总是可以覆盖继承的设置.

  • maven release插件、hudson和nexus如何处理您如何设置多个项目(这可能是一个巨大的问题,如果有人在设置多项目构建时被发现,那就更重要了)?

我使用的设置运行良好,没有什么特别值得一提的.

实际上,我想知道maven release插件如何处理模式#1(尤其是<parent>部分,因为在发布时不能有快照依赖项).这听起来像是鸡或蛋的问题,但我只是不记得它是否有效,我太懒了,无法测试它.

Java相关问答推荐

Java小程序未在MacOS上运行

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

在Java 8之后,HashMap的最坏情况下时间复杂度仍然是O(n)而不是O(log n)?

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

如何使用jooq generator将表名和列名映射为人类可读的?

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

将带有js文件的 bootstrap 程序导入maven项目时出错

无法了解Java线程所消耗的时间

Java Mooc.fi Part 12_01.Hideout -返回和删除方法

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

如何在Java springboot中从一个端点发送多个时间响应?

如何根据配置动态创建N个bean

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

插入中的JOOQ序列,设置为VS值

为什么没有加载java.se模块?

如何在JSP中从select中获取值并将其放入另一个select

如何用Micrometer&;斯普肯