Maven父母pom vs模块pom

问题:

在多项目构建中似乎有几种方法来构建父pom,我想知道是否有人对每个方面的优点/缺点有什么想法。
拥有父母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-core
最后,还有一个选项,其中模块定义和父级是分开的

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

父pom包含任何“共享”配置(dependencyManagement,属性等),myproject / pom.xml包含模块列表。
目的是将其扩展到大规模构建,因此应该可扩展到大量的项目和工件。
几个奖金问题:

  • 在源代码控制,部署目录,通用插件等中定义各种共享配置的最佳位置(我假设父级,但我经常被这个被咬住,他们最终在每个项目中而不是一个共同的)。
  • maven-release插件,hudson和nexus如何处理您如何设置多项目(可能是一个巨大的问题,如果有人被设计成多项目构建,那么更多的是呢)?

编辑:每个子项目都有自己的pom.xml,我把它留下来保持简洁。

回答:

在我看来,为了回答这个问题,你需要考虑项目的生命周期和版本控制。换句话说,父母pom是否有自己的生命周期,即它可以与其他模块分开释放吗?
如果答案是(这是大多数项目在问题或评论中提到的情况),那么父pom需要自己的模块从VCS和从Maven的角度来看,你会最终在VCS级别上这样做:

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

这使得结帐有点痛苦,一种常见的处理方式是使用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将导致以下本地结构(模式#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:它永远不会被释放,它不包含一个真正的版本,因为这个文件永远不会被释放,它只包含一个模块列表。使用此文件,结帐将导致此结构(模式#3):

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

这个“黑客”允许在结帐后从根部启动反应堆构建,并使事情更加方便。实际上,这是我喜欢为大型建筑设置maven项目和VCS存储库:它只是工作,它扩展得很好,它提供了您可能需要的所有灵活性。
如果答案是没有(回到初始问题),那么我认为你可以使用模式#1(做最简单的事情,可能会工作)。
现在,关于奖金问题:

老实说,我不知道如何在这里不能给出一般的答案(例如“使用你认为有意义的层次来互动”)。无论如何,小孩poms总是可以覆盖继承的设置。

我使用的设置很好,没什么特别的。
实际上,我不知道maven-release-plugin如何处理模式#1(特别是与<parent>部分,因为在发布时不能有SNAPSHOT依赖关系)。这听起来像一个鸡蛋或鸡蛋问题,但我不记得如果它的工作,太懒了测试它。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Maven parent pom vs modules pom

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 1 = 4