gpt4 book ai didi

maven - 在多模块 Maven 项目中在哪里定义属性?

转载 作者:行者123 更新时间:2023-12-02 08:49:31 25 4
gpt4 key购买 nike

目前,我的项目结构如下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>信息。但是将这些信息放在哪里,因为它取决于代码所在的分支(即 trunk 中的代码的 <scm> 的值与 branch-X< 中的代码不同/em>,或分支-Y)。

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

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

最佳答案

如果你喜欢在 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>

和你的 parent (在这种情况下)。

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

你必须定义你正在使用的模块:

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

除此之外,您还应该在该 pom 中定义 dependencyManagement 和 pluginManagement。

如果你想拥有一个完整的独立父 pom,你必须定义一个单独的项目,其中包含 pom 以及仅用于该 pom 的 scm 配置,并真正发布该 pom(就像一个 jar Artifact ,除了它是一个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:///project/trunk/ scm:svn:http:///project/trunk/ scm:svn:http:///project/trunk/

如果您担心使用分支等的问题,您可以通过 maven-release-plugin 处理。这使您可以通过以下方式创建分支:

mvn release:branch 

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

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

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

关于maven - 在多模块 Maven 项目中在哪里定义属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9584201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com