pom.xml和settings.xml中覆盖Maven属性的顺序是什么?

18

今天我观察到在settings.xml中定义的Maven属性会覆盖pom.xml中的属性。

由于这只是一个观察结果,我并不确定这是否完全正确。因此,我正在寻找参考资料或一些文章,但是我没有找到任何关于在settings.xmlpom.xml中使用相同名称定义属性重写行为的具体说明。

也许有人可以提供参考部分的链接(我可能已经忽略了)或可靠的文章/博客?


你有相同ID或不同ID的个人资料吗? - khmarbaise
POM中的属性没有任何配置文件;settings.xml中的属性位于一个带有ID的配置文件中,该ID在其他地方未被使用。 - Ralph
但是,如果您的属性在pom文件和settings.xml文件中具有相同的名称,则它们将被来自settings.xml文件的值覆盖。否则,无法通过配置文件覆盖属性。 - khmarbaise
@khmarbaise 正确 - 那就是观察到的行为。我只想知道这种行为在哪里被定义/描述。-- 你回答中的链接和引用正是我要找的。 - Ralph
@khmarbaise: 场景是这样的:我有一个项目,需要更改一些只适用于开发者工作站的值,但我不想为每个开发者创建单独的配置文件。 - Ralph
3个回答

17

根据文档,我认为很清楚哪个具有优先权(摘自文档):

如果从设置文件激活了配置文件,则其值将覆盖 POM 文件或 profiles.xml 文件中同名的配置文件。

Maven 3 中不再支持profiles.xml,仅在 Maven 2.2.1 中支持但不应使用。


8

1
你知道 -D 是什么意思吗? - Christian
@Christian 这似乎具有最高优先级并覆盖了所有内容,即应该在此列表中排在最后。 - Enrice

2

我在我的maven 3.3.9上进行了测试。

首先,如果我们谈论settings.xml,属性总是在profiles中定义的。 全局settings XML中的属性具有最高优先级,并将覆盖用户settings.xml和特定的pom.xml,除非profiles之间存在名称冲突。

如果存在这种情况,即在全局、用户设置以及pom.xml中都有相同id的profile,则用户/本地settings.xml具有最高优先级。 即使pom.xml中的属性不在profile内,来自与其同名的活动profile的用户/本地settings.xml属性也会胜出。 顺便说一下,全局settings.xml也会击败没有profile的pom.xml属性。

顺带一提: 对于repositories和mirrors,逻辑略有不同:

  • <mirrors> 中用户/本地设置的优先级高于全局设置。
  • 然而,对于 <repositories>:pom 的优先级最高,其次是本地设置,再次是全局设置。

Maven设置优先级的方式非常混乱和不一致。 - Jack Chen

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