我认为这有点明显,但我仍然认为这是一个缺点......
我有 23 个 Mavenized 项目。我现在添加
- 我将仅在我公司的 base POM 中添加
部分,并使用属性参数化 URL,例如
<scm> <connection>${scmBaseConnection}/${scm.module}/${scm.edition}</connection> <developerConnection>${scmBaseConnection}/${scm.module}/${scm.edition}</developerConnection> <url>${fisheyeBaseUrl}/${scm.module}</url> </scm>
- 然后每个项目根(聚合器)POM 只需要声明其scm。
<properties>
相应地(并且不必重新声明整个部分),例如:
<scm.module>sharktopus</scm.module> <scm.edition>trunk</scm.edition>
但我很快意识到我不能这样做:发布插件使用标签和下一个版本的重写每个POM SCM 信息,因此每个此类 POM 都需要其自己的
好吧,所以我决定将常见的 SCM 详细信息存储在基本 POM 属性中,并让每个项目根 POM 使用这些属性声明其
<scm> <connection>${scmBaseConnection}/sharktopus/trunk</connection> <developerConnection>${scmBaseConnection}/sharktopus/trunk</developerConnection> <url>${fisheyeBaseUrl}/sharktopus</url> </scm>
但这也不起作用,因为发布插件使用已解析值进行重写(事后看来,这很明显)。所以,例如对于发布标签 POM,上面的信息将被重写为:
<scm> <connection>scm:svn:https://mysvnhost.net/sharktopus/tags/R1_NewStuff</connection> <developerConnection>scm:svn:https://mysvnhost.net/sharktopus/tags/R1_NewStuff</developerConnection> <url>https://mysvnhost.net/sharktopus</url> </scm>
这意味着每个 POM 必须有其自己的
- 每个人都会这么做吗?
- 如果您的 SCM 网址发生变化,会发生什么情况 - 您是否只是在所有项目中搜索/替换?
- 是否是对发布插件的功能请求,要求重写部分 URL,例如保留属性引用,但覆盖“最终”细节?
最佳答案
定义 scm 部分的唯一位置是项目根目录而不是公司根目录。在多模块构建中,只需要一个 scm 部分。发布插件会替换属性的原因很简单。发布后,这些 pom 必须代表该软件的状态。如果它们具有属性,则不可能保证正确的值等。因此结果将无法重现...... 如果 SCM URL 更改,它将仅对新项目有效,而对旧项目无效,因为它们已经部署等。
关于maven-2 - Maven 版本 :prepare overwrites SCM properties with resolved values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3683543/