Maven 2 Maven不会替换';settings.xml';当它被调用时

Maven 2 Maven不会替换';settings.xml';当它被调用时,maven-2,Maven 2,我已在settings.xml文件中为所有存储库定义了本地镜像: <mirror> <id>myMirror</id> <mirrorOf>*</mirrorOf> <url>file://${mypath}/maven/.m2/repository</url> </mirror> 其中${mypath}是调用Maven时传递的变量: mvn -Dmypath="/D:/test" p

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

<mirror>
  <id>myMirror</id>
  <mirrorOf>*</mirrorOf>
  <url>file://${mypath}/maven/.m2/repository</url>
</mirror>
其中${mypath}是调用Maven时传递的变量:

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

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

<repository>
        <id>central</id>
        <url>http://${mypath}/maven/.m2/repository</url>
</repository>

中心的
http://${mypath}/maven/.m2/repository
当我用完整的URL替换my settings.xml中的变量时,构建工作正常,如下例所示:

<mirror>
        <id>myMirror</id>
        <mirrorOf>*</mirrorOf>
        <url>file:///D:test/maven/.m2/repository</url>
</mirror>

我的镜子
*
file:///D:test/maven/.m2/repository

这可能是一个bug-不幸的是,属性替换在Maven插件中似乎并不一致。我自己在另一个插件的配置项中指定了两个以上的属性时遇到了一个错误。

settings.xml不像pom那样插入,因此不能像上面所示那样使用该属性。

将属性替换为settings.xml并不像您预期的那样工作

它将替换profiles元素内的属性(正如您看到的,它将替换到您的存储库url中,存储库url将在概要文件内定义),但不会替换到概要文件外的元素(正如您在mirrors部分中看到的)。这是因为settings.xml中的profile元素是pom.xml profile元素的截断版本。这是一种允许在POM中设置配置的机制,因此允许在profiles元素中进行属性替换,因为它们实际上是POM的一部分

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

编辑:在mavens文档的“快速概览”部分的最后一句(相当隐藏)中,它指出:

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


不过,有一个解决方法,您可以将环境变量替换为settings.xml。如果设置环境变量:

set M2_MIRROR=D:\test
并按如下方式配置存储库url:

<url>file://${M2_MIRROR}/maven/.m2/repository</url>
file://${M2\u MIRROR}/maven/.M2/repository

然后像平常一样调用Maven,环境变量被替换,您的构建应该可以按需要工作。

这是一个老问题,但从Maven 3开始,或者在Maven 3之前,如果您以“
env
”作为前缀,您可以引用环境变量

我是这样做的:

  <localRepository>${env.M2_LOCAL_REPO}</localRepository>
<project ...>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.company.jcompany</groupId>
        <artifactId>persistence</artifactId>
        <version>5-SNAPSHOT</version>
    </parent>
    <artifactId>persistence-api</artifactId>
    <version>5.0.0-SNAPSHOT</version>
    ...
</project>
${env.M2\u LOCAL\u REPO}

然后每个开发人员将M2\u LOCAL\u REPO设置到一个适当的位置。

我在这里的体验与您的答案略有不同,因此我认为值得在另一个地方提及

变量替换确实在概要文件中起作用,但如果您需要在父pom解析发生之前替换它们,那么它似乎会失败

我在这里有以下配置:

<profiles>
  <profile>
    <id>company-dev</id>
    <properties>
      <company.repo.deployment.endpoint>https://companyartifacts.jfrog.io/companyartifacts</company.repo.deployment.endpoint>
      <company.repo.download.endpoint>https://companyartifacts.jfrog.io/companyartifacts</company.repo.download.endpoint>
    </properties>
    <repositories>
      ...
      <repository>
        <id>company-repo-snap</id>
        <name>libs-snapshots</name>
        <url>${company.repo.download.endpoint}/libs-snapshots</url>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
        <releases>
          <enabled>false</enabled>
        </releases>
      </repository>
    </repositories>
    </pluginRepositories>
  </profile>
</profiles>
然后,我开始出现这个异常,甚至运行了一些简单的东西,比如
mvn-X help:effective pom
only:

(请注意,URL中未替换变量)

对于这个问题,我发现唯一合理的解释是父pom解析在过程中发生得太早,以至于变量还没有被替换。当我不必为父POM获取快照时,所有变量都被成功替换,正如预期的那样。不确定我是否应该将此报告为bug


回答问题时使用Maven 3.6.3,如果有必要的话。

可以。正如我在问题中所说,我能够将变量插入到url标记中,url标记嵌套在repository标记中。请注意,我提到的这个存储库标记位于'settings.xml'文件中,而不是pom文件中。很抱歉,我误读了。配置文件部分是内插的,但并非所有的“基本”设置都是内插的,例如,如果您尝试为本地存储库使用属性,结果也不太理想。这是正确的,但从您的回答中不清楚为什么不能在配置文件元素之外设置属性,我试图用我的回答详细说明它不应该是
${env.M2\u MIRROR}
。这正是我目前正在调查的问题。我认为这是一个错误。你找到解决办法了吗?我发现,从命令行或通过.mvn/maven.config文件注入变量时,行为是不同的。这对我来说并不理想,因为我正在寻找一种在不同项目之间共享属性的方法。这对我来说似乎是一个bug,但我没有足够的时间报告一个适当的问题。不幸的是,maven技术不再是我的优先事项。
<project ...>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.company.jcompany</groupId>
        <artifactId>persistence</artifactId>
        <version>5-SNAPSHOT</version>
    </parent>
    <artifactId>persistence-api</artifactId>
    <version>5.0.0-SNAPSHOT</version>
    ...
</project>
[ERROR]   The project com.company.jcompany:persistence-api:5.0.0-SNAPSHOT (/var/lib/jenkins/jobs/jcompany_persistence_api-trunk/workspace/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM: Could not transfer artifact com.company.jcompany:persistence:pom:5-SNAPSHOT from/to company-repo-snap (${company.repo.download.endpoint}/libs-snapshots): No connector available to access repository company-repo-snap (${company.repo.download.endpoint}/libs-snapshots) of type default using the available factories WagonRepositoryConnectorFactory and 'parent.relativePath' points at wrong local POM @ line 5, column 10 -> [Help 2]
org.apache.maven.model.resolution.UnresolvableModelException: Could not transfer artifact com.company.jcompany:persistence:pom:5-SNAPSHOT from/to company-repo-snap (${company.repo.download.endpoint}/libs-snapshots): No connector available to access repository company-repo-snap (${company.repo.download.endpoint}/libs-snapshots) of type default using the available factories WagonRepositoryConnectorFactory
    at org.apache.maven.project.ProjectModelResolver.resolveModel(ProjectModelResolver.java:159)
    at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813)
    at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232)