我们一直在 POM 文件中使用 SCM URL,如下所示:
<scm>
<connection>scm:hg:file:///${basedir}</connection>
<developerConnection>scm:hg:file:///${basedir}</developerConnection>
</scm>
它要求我们使用“mvn release:prepare -DpushChanges=false”开始发布过程,但无论如何我们都必须这样做(hg 插件无法正确处理身份验证)。对我们来说最大的好处是,如果发布过程在任何时候出错,我们都可以“剥离”——除了本地开发人员之外,没有人会看到这一点。
如果我们在 Mercurial 结帐中有一个目录,则相同的过程也有效。在这种情况下,以下 URL 可以解决问题:
<scm>
<connection>scm:hg:file:///${basedir}/..</connection>
<developerConnection>scm:hg:file:///${basedir}/..</developerConnection>
<tag>HEAD</tag>
</scm>
但是:当那里有另一个级别时,一切都会出错。我已经尝试了文件 URL 的多种变体,但它们似乎都失败了。
使用“scm:hg:file:///${basedir}/../..”的幼稚方法会导致站点插件和发布插件都失败。前者会告诉我:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.2:site (default-site) on project epik-protocol-spec: Execution default-site of goal org.apache.maven.plugins:maven-site-plugin:3.2:site failed: This SCM url 'scm:hg:file:///../epik-protocol-spec' is invalid due to the following errors:
[ERROR] * An hg 'file' url must be on the form 'file:///' or 'file://localhost/'.
[ERROR] For more information about SCM URL Format, please refer to: http://maven.apache.org/scm/scm-url-format.html
('epik-protocol-spec' 是正在运行的构建中的模块的名称)
发布插件遇到类似的问题:在发布:准备之后,release.properties 文件会将 scm.url 设置为“file:///..”,然后在发布期间将无法获取标记代码的副本:履行。解决方法是在步骤之间手动修复属性。我还没有找到使网站构建工作的方法。
我的目标是:
- 有一个开箱即用的构建(即从 IDE 克隆项目并运行任何目标)
- 能够在构建服务器上生成站点(并运行其他构建)
- 能够使用发布插件运行发布,在推送之前审查所有更改
有没有人解决这个问题?为什么 URL 会被严重破坏——是方法不好还是我们遇到了 Maven 问题?
编辑
按照 Charlee 的建议,我检查了 mvn help:effective-pom 的输出。SCM URL 在其中受到破坏。它还显示 Maven 将模块名称附加到 URL,这意味着有必要在每个模块上定义 URL——假设可以停止奇怪的修改。
像这样的自定义属性:
<properties>
<test.property>scm:hg:file:///${basedir}/../..</test.property>
</properties>
不会被破坏,它会按预期得到解决(也使用有效的 POM 检查)。