我认为,要回答这个问题,您需要考虑项目生命周期和版本控制。换句话说,父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/
您也可以选择pom.xml
在trunks
目录中添加一个:
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
这种“ hack”允许在签出后从根目录启动反应堆构建,并使事情变得更加方便。实际上,这就是我喜欢为大型构建设置Maven项目和VCS存储库的方式:它可以正常工作,可以很好地扩展,它可以提供您可能需要的所有灵活性。
如果答案是否定的(回到最初的问题),那么我认为您可以使用模式1(做可能可行的最简单的事情)。
现在,关于奖金问题:
- 在哪里定义各种共享配置的最佳位置是哪里,如源代码控制,部署目录,通用插件等。(我假设是父级,但我经常对此感到bit恼,它们最终出现在每个项目中,而不是最终出现在每个项目中一个普通的)。
老实说,我不知道如何在这里不给出一般性的答案(例如“使用您认为有意义的层次来使事物相互关联”)。而且无论如何,子poms始终可以覆盖继承的设置。
- maven-release插件,hudson和nexus如何处理您如何设置多项目(可能是一个巨大的问题,当有人通过多项目构建的方式来抓捕时,问题就更大了)?
我使用的设置效果很好,没有什么特别需要提及的。
实际上,我想知道maven-release-plugin如何处理模式1(尤其是本<parent>
节,因为您在发行时不能拥有SNAPSHOT依赖项)。这听起来像是鸡肉或鸡蛋的问题,但我只是不记得它是否有效并且懒得测试它。