在多模块Maven项目中定义属性的位置?

时间:2012-03-06 12:59:46

标签: maven

目前,我的项目Foo具有以下结构:

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>信息。 但是在哪里放置这些信息,因为它取决于代码所在的分支(即{em> trunk 中的代码的<scm>值与分支中的代码不同 - X branch-Y )。

  • 解决方案#1 <scm>项目中定义foo-parent。这样,每个模块都将提供此信息。但是,我将有几个版本的foo-parent项目,每个分支一个。它会使这个父母的版本化变得更加困难......
  • 解决方案#2 <scm>项目中定义foo-parent,但在内部添加参数(例如<scm>scm:svn:http://server/foo/${svn.branch}</scm>)。但是,这只会解决问题:我在哪里定义svn.branch属性?
  • 解决方案#3 <scm>中定义project-foo/pom.xml,现在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文件聚合。我说我&#34;外化&#34;它只是为了表明它与其他模块分开。这样做的主要目的是尽可能保持父母的稳定,这就是为什么我试图将父pom与聚合pom分开的原因。

然而,由于我广泛使用Maven发布插件(不是在该项目上,而是在其他项目上),我认为最好不要继续这条轨道,并合并所有foo-parent/pom.xml in project-foo/pom.xml。这将简化我的项目管理。

1 个答案:

答案 0 :(得分:6)

如果你想在maven中使用多模块,你必须遵循一些最佳实践,这意味着首先让父进入你的结构而不是外部。这意味着:

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>

我不建议因为它产生的配置比需要的更多...

如果您使用“默认”,这是最佳做法:

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

在你的module-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进行实际发布(就像一个jar工件,除了它是一个pom)当然还有一个你可以在你的项目中用作父项的版本。

直到SCM领域:多模块构建中此类信息的唯一位置在project-foo / pom.xml中:

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

SCM的定义永远不会出现在模块中!此外,永远不要使用属性来定义scm-area,只需使用您需要的信息:

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

如果您正在考虑使用分支等问题,您可以通过maven-release-plugin处理该问题,这样您就可以通过以下方式创建分支:

mvn release:branch 

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

您还需要配置distributionManagement区域以定义SNAPSHOT的放置位置和工件的发布版本(我希望您使用的是Rexx库,如Nexus,Artifactory或Archiva?)。

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