我在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,替换环境变量,您的构建应该按照需要工作.
现在这是一个老问题,但从 Maven 3 开始,可能在之前,如果您以 ' env' 为前缀,您可以参考环境变量
我这样做:
<localRepository>${env.M2_LOCAL_REPO}</localRepository>
Run Code Online (Sandbox Code Playgroud)
然后每个开发人员设置M2_LOCAL_REPO到一个合适的位置。
| 归档时间: |
|
| 查看次数: |
10381 次 |
| 最近记录: |