调用时,Maven不会替换'settings.xml'中的变量

Alc*_*sta 8 maven-2

我在settings.xml文件中为所有存储库定义了一个本地镜像:

<mirror>
  <id>myMirror</id>
  <mirrorOf>*</mirrorOf>
  <url>file://${mypath}/maven/.m2/repository</url>
</mirror>
Run Code Online (Sandbox Code Playgroud)

我希望我的镜像指向本地路径,在这种情况下路径是:

file://${mypath}/maven/.m2/repository
Run Code Online (Sandbox Code Playgroud)

$ {mypath}是我在调用Maven时传递的变量:

 mvn -Dmypath="/D:/test" package
Run Code Online (Sandbox Code Playgroud)

问题是Maven在调用变量时不会替换变量.我可以看到通过检查构建日志发生了这个错误.例如,Maven报告它正在从file:// $ {mypath} /maven/.m2/repository下载文件,正确的是file:/// D:/test/maven/.m2/repository.

我还注意到Maven在将变量插入repository标记的url子标记时正确替换了我的变量:

<repository>
        <id>central</id>
        <url>http://${mypath}/maven/.m2/repository</url>
</repository>
Run Code Online (Sandbox Code Playgroud)

当我使用完整的URL替换settings.xml中的变量时,构建工作正常,如下例所示:

<mirror>
        <id>myMirror</id>
        <mirrorOf>*</mirrorOf>
        <url>file:///D:test/maven/.m2/repository</url>
</mirror>
Run Code Online (Sandbox Code Playgroud)

Ric*_*ler 13

属性替换到settings.xml中并不像您期望的那样工作.

它将替换profiles元素中的属性(如您所见,它替换到您的存储库URL,它将在配置文件中定义),但不能替换到配置文件之外的元素(正如您在镜像部分中看到的那样).之所以进行此区分,是因为settings.xml中的profile元素是pom.xml profile元素的截断版本.它是一种允许将配置设置到POM中的机制,因此在配置文件元素中允许属性替换,因为它们实际上是POM的一部分.

profiles元素之外的设置部分表示平台配置,这些不应受单个构建的影响,因此不能替代命令行属性.这是有道理的,但在任何地方都没有明确说明.

编辑:在mavens文档的设置页面中,在快速概述部分的最后一句(非常隐藏)中,它指出:

请注意,settings.xml中的配置文件中定义的属性不能用于插值.


但是有一种解决方法,您可以将环境变量替换为settings.xml.如果设置环境变量:

set M2_MIRROR=D:\test
Run Code Online (Sandbox Code Playgroud)

并按如下方式配置存储库URL:

<url>file://${M2_MIRROR}/maven/.m2/repository</url>
Run Code Online (Sandbox Code Playgroud)

然后正常调用Maven,替换环境变量,您的构建应该按照需要工作.

  • 它不应该是“${env.M2_MIRROR}”吗? (3认同)

Dav*_*sel 5

现在这是一个老问题,但从 Maven 3 开始,可能在之前,如果您以 ' env' 为前缀,您可以参考环境变量

我这样做:

  <localRepository>${env.M2_LOCAL_REPO}</localRepository>
Run Code Online (Sandbox Code Playgroud)

然后每个开发人员设置M2_LOCAL_REPO到一个合适的位置。