具有父POM和SVN布局的多模块Maven项目

13

目前我有大约16个项目,使用maven构建并部署到同一应用服务器,形成了类似于“门户”的东西。我已经建立了一个父pom来处理常见的依赖和插件配置。目前,我的SVN结构类似于:

portal_root
    +project1
        +tags
        +branches
        +trunk
    +project2
        .
        .
        .
    +projectn
    pom.xml
每个项目都是单独部署的。也就是说,project1不依赖于project2,每个项目可以被修改和部署而无需修改其他内容。
这在使用 SVN 时会带来问题,因为如果另一个开发人员想要检出整个“portal”根目录(包括父POM),他们也会默认下载所有标签和分支的副本!这并不理想。
我能想到的唯一解决办法就是使用以下内容:
 portal_root
     +tags
     +branches
     +trunk
         +project1
              +src
              pom.xml
         +project2
             .
             .
             .
         pom.xml
然而,现在所有项目更改将在标签文件夹中进行跟踪。对我来说这不是个大问题,但是分支现在似乎变得很痛苦了。
我目前还在努力将Teamcity与此连接,这样会更容易一些,因为我只需要监视一个目录(例如tags)就可以捕获所有需要构建的内容。我还将构件部署到企业Nessus存储库中。
我希望有人能在这里给我一些建议,因为我找不到任何讲解整个构建生命周期和最佳实践的文档。
我喜欢能够使用单个maven命令构建和部署所有项目的想法。我也喜欢所有公共依赖项、存储库信息和插件信息都在一个地方。
2个回答

25

您可以使用以下布局:

+parent-project
  pom.xml
+child-project-1
  pom.xml
+child-project-2
  pom.xml
在父项目的pom文件中添加以下内容:
<modules>
    <module>../child-project-1</module>
    <module>../child-project-2</module>
</modules>
在子项目的pom.xml中添加:
<parent>
    <artifactId><!-- parent artifactId --></artifactId>
    <groupId><!-- parent groupdId --></groupId>
    <version><!-- parent version --></version>
    <relativePath>../parent-project</relativePath>
</parent>

子项目可以选择性地依赖于其他项目。

以下链接也可能有所帮助:


如果您想在子项目中使用父项目,请确保将父数据添加为依赖项。 - cevaris

4

对于JohnS的方法的一个变体是使用svn:externals将子项目的适当trunk/tags/branches钩到父项目的适当trunk/tag/branch上。这样,检出父项目的一个变体会拉出其他项目的正确版本。

只有在一起检出所有项目是合理的情况下,这才有意义。


更有帮助的是评论我的方法,而不是默默地点踩。考虑到这种方法在过去四年中一直帮助我们处理多个客户特定版本,同时最小化代码差异,我很想知道我这些年来做错了什么。 - Nicola Musatti
1
我认为svn:externals非常聪明,特别是在大型企业svn仓库中。这样,您可以将maven目录布局绑定在一起(如果需要),而无需更改整个仓库结构。 - Sylar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接