在我看来,要回答这个问题,您需要从项目生命周期和版本控制的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>
部分,因为在发布时不能有快照依赖项).这听起来像是鸡或蛋的问题,但我只是不记得它是否有效,我太懒了,无法测试它.