2012-03-06 49 views
1

目前,我有以下结构为我的项目Foo何处定义多模块Maven项目中的属性?

foo-parent 
    +- pom.xml 

project-foo 
    +- pom.xml 
    +- module-1 
    | +- pom.xml 
    | +- ... 
    +- module-2 
    | +- pom.xml 
    | +- ... 
    +- ... 

foo-parent,有pom.xml定义为我的项目(基本依赖,插件管理等)所有的通用配置。 父项的外部化可以帮助我获得稳定的父配置(如果父项是根pom.xml,则该项也用于聚合所有模块)。

project-foo/pom.xml是只有在这里聚合所有模块,并执行定义任何父...

现在,我修改我的项目使用Maven插件发布。因此,我需要配置<scm>信息。 但是,在把这个信息,因为它取决于其中代码位于所述分支(即<scm>值是在躯干代码不同于在分支-X,或分支-Y) 。

  • 解决方案#1foo-parent项目定义<scm>。这样,每个模块都会提供这些信息。不过,我会有几个版本的foo-parent项目,每个分支一个。这将使这位家长非常困难的版本...
  • 解决方案#2定义在foo-parent项目<scm>,但里面添加参数(如<scm>scm:svn:http://server/foo/${svn.branch}</scm>)。但是,这只会解决问题:我在哪里定义svn.branch属性?
  • 溶液#3定义在project-foo/pom.xml<scm>,现在将有foo-parent作为母体,并改变所有子模块的<parent>指向project-foo/pom.xml(即foo-parent > foo-root > module-X)。
  • 解决方案#4在每个模块中定义<scm>(或svn.tag属性)。不太喜欢那个...
  • 解决方案#5任何其他的想法?

我的观点是使用解决方案#3,但是你对此有何感想?

谢谢。


编辑(关于khmarbaise答案)

项目foo-parent是在project-foo子目录现实,但不是由project-foo/pom.xml文件汇总。我说我“外化”它只是为了表明它与其他模块分开。主要的兴趣是尽量保持父母尽可能稳定,这就是为什么我试图将父母分离出聚集体的原因。但是,由于我广泛使用了Maven发布插件(不是在该项目上,而是在其他项目上),我认为最好不要在此轨道上继续,并合并所有foo-parent/pom.xml,project-foo/pom.xml中的所有foo-parent/pom.xml。这将减轻我项目的管理。

回答

6

如果你喜欢在maven中使用multimodules,你必须遵循一些最佳实践,这意味着首先将父代加入到你的结构中而不是外部。这意味着:

project-foo 
    +- pom.xml (This is your parent for the module-1 etc.) 
    +- module-1 
    | +- pom.xml 
    | +- ... 
    +- module-2 
    | +- pom.xml 
    | +- ... 
    +- ... 

什么是可能的偏离是创建一个新的文件夹:

project-foo 
    +- pom.xml 
    +- project-parent (pom.xml) 
    +- module-1 
    | +- pom.xml 
    | +- ... 
    +- module-2 
    | +- pom.xml 
    | +- ... 
    +- ... 

但比你必须定义父有点怪的模块1:

<parent> 
    <groupId>..</groupId> 
    <artifactId>..<artifactId> 
    <version>..</version> 
    <relativePath>../project-parent/<relativePath> 
    </parent> 

,我不会推荐它的原因产生比需要更多的配置...

我F你使用“默认”,这是最好的做法:

project-foo 
    +- pom.xml (This is your parent for the module-1 etc.) 
    +- module-1 
    | +- pom.xml 
    | +- ... 
    +- module-2 
    | +- pom.xml 
    | +- ... 
    +- ... 

你的模块-1,它看起来像下面的:

<parent> 
    <groupId>..</groupId> 
    <artifactId>..<artifactId> 
    <version>..</version> 
    </parent> 

,并在你的父母(在这种情况下)。

project-foo 
    +- pom.xml (This is your parent for the module-1 etc.) 

你必须定义你所使用的模块:

<modules> 
    <module>module-1</module> 
    <module>module-2</module> 
    .. 
</modules> 

除此之外,你也应该定义dependencyManagement和pluginManagement成POM。

如果你想有一个完整的单独的父pom你必须定义一个单独的项目,其中包含pom加上该pom的scm配置只做一个真正的pom发布(就像一个罐子神器除外它是一个pom),当然还有一个可以在项目中作为父母使用的版本。

来到SCM区域的点:一个多模块构建中对这类信息的唯一地点是在项目的富/ pom.xml中:

project-foo 
    +- pom.xml (This is your parent for the module-1 etc.) 

无处将是定义SCM从来不在模块中!而且从不使用属性来定义SCM-区域仅仅使用你所需要的信息:

SCM:SVN:SCM:SVN:HTTP:///项目/主干/ SCM:SVN:HTTP:///项目/主干/ SCM:SVN:HTTP:///项目/主干/

如果您使用的分支等,你可以处理回环有关问题通过maven-release-plugin这使您可以通过创建一个分支的可能性:

mvn release:branch 

基于此和在发布过程中ess SCM区域的URL将适当地更改。所以你不需要担心它们(不要为它们使用属性,导致它不起作用!)

您还需要配置distributionManagement区域以定义将SNAPSHOT和发布版本的工件放在哪里(我希望你使用的是像Nexus,Artifactory或Archiva这样的Repository Manager)。

我可以推荐阅读Sonatype Book on multi-module builds

+0

感谢您的回答。我想我已经知道Maven是如何工作的,即使对于多模块也是如此,但正如我的版本所述,我试图“外化”父级“pom.xml”,这似乎不是一个好主意(至少在我的上下文中)。所以解决方案就是合并父集和聚集的pom。 – romaintaz 2012-03-06 13:58:24

+0

为什么这不是一个好主意?正如我所描述的,只需从你的“super-pom”中创建一个单独的项目,并从中创建一个发行版(包括scm plus distributionManagement),而不是将它用作父项目的父项目,就这样吧。 – khmarbaise 2012-03-06 14:04:34

+0

我想在我当前的上下文中,这不是一个好主意*。与根目录中的单个父聚合聚合pom相比,为单个多模块项目分配单独的pom并不是一个优势... – romaintaz 2012-03-06 14:42:00