在 pom.xml 中用变量替换版本时抛出错误

Posted

技术标签:

【中文标题】在 pom.xml 中用变量替换版本时抛出错误【英文标题】:Error throwing while substituting variable for version in pom.xml 【发布时间】:2022-01-09 07:03:40 【问题描述】:

我在用变量替换 pom.xml 文件中父块中的版本时遇到错误。

对于属性选项卡,它工作正常,但是当我将版本更改为在父块中的“mvn clean install”之前导出的变量时,构建会失败。

错误如下所示。

“由 org.sonatype.aether.transfer.ArtifactTransferException 引起:无法将工件 org.springframework.boot:spring-boot-starter-parent:pom:$env.SPRINGBOOTVERSION 从/到 abc -repos (https://continuousintegration.abc.com/artifactory/abc-repos): 路径中索引 122 处的非法字符:https://continuousintegration.abc.com/artifactory/abc-repos/org/springframework/boot/spring-boot-starter-parent/$env.SPRINGBOOTVERSION/spring-boot-starter-parent-$env.SPRINGBOOTVERSION.pom"

在解析 pom.xml 之前,不会为父 pom 替换变量。


下面是被替换的 pom.xml 的代码块。

<parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>$env.SPRINGBOOTVERSION</version> ---------> replaced version by variable
        <relativePath />
    </parent>

这里的 maven 版本是 3.0.5 ---(尝试使用 3.8.1 进行本地构建)

对此的任何解决方案都会有所帮助。

仅供参考:

变量以以下格式存储在文件中。

---> 导出 SPRINGBOOTVERSION=1.2.3

然后使用 source 命令获取到 shell。

另外,在 pom.xml 的属性块中给出的变量是 被maven接受,它也在工作。只是有问题 这里是父块。

【问题讨论】:

真的使用 Maven 3.0.5 吗?使用 8 年以上的旧软件...还问你为什么喜欢在这里使用变量版本? 即使它不适用于 3.8.1,我也在本地构建时尝试过。 对于 3.8.1 也在这里遇到同样的错误 对此的简单回答是:不可能。我的问题一直是:你喜欢做什么?您要解决的问题是什么? 我需要将所有依赖项作为变量存储在一个文件中,这样,每个更新的版本都很容易更改,因此,我们只需要更改 1 个文件,而不是整个 pom文件。因此,所有版本都添加到 var.env 文件中并在 pom.xml 中替换,因此,如果有任何更改,我们只需要更改 var.env。 【参考方案1】:

为了澄清,您正在设置替换变量的值:

SPRINGBOOTVERSION

以某种方式在您的环境中,即作为运行命令的 shell 中的环境变量,它不起作用?

【讨论】:

我创建了一个 var.env 并在此处添加了所有依赖项,并一直调用此文件“source var.env”,而不是那个地方的值,以便它将存储在shell,从那里开始,依赖项的值在 pom.xml 中得到更新但是她在父块的情况下,它抛出了上述错误。 好的,我明白了。所以你在终端运行source var.env,然后从同一个终端运行你的maven命令?看起来变量替换没有发生。 没错,就是这个问题,但不知道为什么没有发生。【参考方案2】:

IMO,maven 永远不会支持您想要的行为,原因是当您执行 mvn installmvn deploy 时,maven 会将工件与 pom 文件一起部署到本地或远程存储库中,但有关您构建的信息环境(即$env.SPRINGBOOTVERSION)没有存储在任何地方,因此,它不是错误或缺少功能 - maven 只是防止在 maven 存储库中存储无效的 pom 文件。

【讨论】:

这里,我已经将所有依赖版本存储在 var.env 文件中,并将其来源到 shell。在属性块的 pom.xml 中,替换变量正在工作,但在父块中,它在上面抛出了一个错误。例如。在 var.env 文件中导出 SPRINGBOOTVERSION=1.2.3,然后通过命令 source var.env 将该文件提供给 shell。 version 的值存储在 shell 中。 为什么要将这些信息存储到外部文件中。 pom.xml 正是这些信息的位置和目的...

以上是关于在 pom.xml 中用变量替换版本时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL java:当请求有未使用的变量时抛出异常

如何在pom中用$变量获得本地repository的路径

在 pom.xml 中对变量进行子字符串化

异常库

pom.xml 中的错误

maven 03-pom.xml核心配置