目前,我的项目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 )。
<scm>
项目中定义foo-parent
。这样,每个模块都将提供此信息。但是,我将有几个版本的foo-parent
项目,每个分支一个。它会使这个父母的版本化变得更加困难...... <scm>
项目中定义foo-parent
,但在内部添加参数(例如<scm>scm:svn:http://server/foo/${svn.branch}</scm>
)。但是,这只会解决问题:我在哪里定义svn.branch
属性? <scm>
中定义project-foo/pom.xml
,现在foo-parent
为父级,并更改<parent>
所有子模块都指向project-foo/pom.xml
(即foo-parent > foo-root > module-X
)。<scm>
(或svn.tag
属性)。不是很喜欢...... 我的观点是使用解决方案#3,但您对此有何看法?
感谢。
编辑(关于khmarbaise答案)
项目foo-parent
实际上位于project-foo
的子目录中,但未由project-foo/pom.xml
文件聚合。我说我&#34;外化&#34;它只是为了表明它与其他模块分开。这样做的主要目的是尽可能保持父母的稳定,这就是为什么我试图将父pom与聚合pom分开的原因。
然而,由于我广泛使用Maven发布插件(不是在该项目上,而是在其他项目上),我认为最好不要继续这条轨道,并合并所有foo-parent/pom.xml
in project-foo/pom.xml
。这将简化我的项目管理。
答案 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等。