我们一直在POM文件中使用SCM URL,如下所示:
<scm>
<connection>scm:hg:file:///${basedir}</connection>
<developerConnection>scm:hg:file:///${basedir}</developerConnection>
</scm>
它要求我们使用“mvn release:prepare -DpushChanges = false”启动发布过程,但我们不得不这样做(hg插件不能正确处理身份验证)。对我们来说最重要的是,如果发布过程在任何时候出错,我们都可以“hg strip” - 除了本地开发人员之外,没有人能够看到它。
如果我们在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:/// ..”,然后将无法获取标记的副本发布期间的代码:执行。解决方法是在步骤之间手动修复属性。我还没有找到使网站构建工作的方法。
我的目标是:
有没有人可以解决这个问题?为什么URL被严重破坏 - 方法不好还是我们遇到了Maven问题?
正如Charlee所提出的,我检查了mvn help:effective-pom的输出。 SCM URL被破坏了。它还显示Maven将模块名称附加到URL,这意味着有必要在每个模块上定义URL - 假设可以停止奇怪的修改。
这样的自定义属性:
<properties>
<test.property>scm:hg:file:///${basedir}/../..</test.property>
</properties>
不会被破坏,它会按预期得到解决(也使用有效的POM进行检查)。
答案 0 :(得分:1)
Maven SCM提供商正在根据“../”和“.. \”匹配方案缩短网址。如果其中一个字符序列匹配,它将向后搜索匹配的斜杠(超过之前的斜杠),将所有内容删除回原点。此规则意味着我的文件URL,如下所示:
scm:hg:file:///C:\some\local\path/../..
会因“../”序列而触发缩短,然后会删除回到之前的 forward 斜杠,这意味着回到“C:”之前的斜杠,从而删除整条道路。
如果点后面没有斜线,则不会触发此行为,因此我的URL末尾的步骤没有造成任何伤害 - 这就解释了为什么我上升到一个级别没有问题。
解决方案(解决方法?)是使用它:
scm:hg:file:///${basedir}${file.separator}..${file.separator}..
然后,无论操作系统如何,URL缩短都会遇到匹配的斜杠,并且它会再次开始工作。
答案 1 :(得分:0)
关于SCM Implementation: Mercurial,它在示例中提到如下: -
scm:hg:http://host/v3
scm:hg:file://C:/dev/project/v3 (windows drive)
<--- only 2 slashes + [os, e.g. drive:/path/...]
scm:hg:file:///home/smorgrav/dev/project/v3 (linux drive)
<--- only 2 slashes + [os, e.g. /home/...]
scm:hg:/home/smorgrav/dev/project/v3 (local directory)
无论如何,Maven告诉我们
This SCM url 'scm:hg:file:///../epik-protocol-spec'
is invalid due to the following errors
如果我错了,请纠正我。我了解您是在Microsoft Windows环境中,并且可能只使用2个斜杠来满足您的要求。
无论如何,另一个疑似可能是${basedir}
被解析为../epik-protocol-spec
。如果我理解正确,那应该是一条完整的道路。
我希望这可能有所帮助。