首页 > 解决方案 > 在 Linux 上使用参数中的特殊符号运行 maven 目标

问题描述

我们有持续集成工具 Bamboo。在那里我可以使用实际命令定义一个 Maven 任务。命令在 Linux 机器上运行。我需要为构建中的某些插件提供密码,但密码包含特殊符号。即 123'123

Maven命令看起来像

mvn clean install -Dsome.property.password=${bamboo.some_psw}
  1. mvn clean install -Dsome.property.password=123'123 这将失败并显示没有为此构建指定目标的消息。好的,我需要转义特殊符号。
  2. mvn clean install -Dsome.property.password="123'123"现在maven可以运行gole了。但是使用 XML 配置构建的自定义插件带有一个占位符,例如

<someTag user="SOME_USER" password="${some.property.password}"/>

并且在 XML 解析中失败,并显示消息“元素类型“someTag”必须后跟属性规范,“>”或“/>”。” 列号从 ${some.property.password} 开始。所以看起来那个报价是用值传递的,并且 XML 无法被解析..

  1. 尝试使用单引号:

mvn clean install -Dsome.property.password='123'\''123'

同样的错误再次争辩说“没有为此构建指定目标”

相同如果mvn clean install -Dsome.property.password=123\'123

如果密码没有特殊符号,一切正常,即

mvn clean install -Dsome.property.password=somepass

顺便说一句,在本地 Windows 机器上一切正常

mvn clean install -Dsome.property.password="123'123"

知道如何在调用 maven 时在带有特殊符号的参数中传递一个值吗?

标签: bashmavenspecial-charactersbamboo

解决方案


您在这里有多个层,如果它们可能(或可能需要但不做)一些转义或值解析,则每个层:

  • 给定的maven插件
  • 行家本身
  • 外壳(bash,sh,...)
  • 调用 Maven 的竹逻辑
  • 竹属性

很可能一层所做的与下一层的期望发生冲突。但是,如果不进行调试,就几乎不可能说出 isuse 到底是什么。肯定这两个:

  • mvn clean -Dsome.property.password="123'123"
  • mvn clean -Dsome.property.password=123\'123

直接在 bash 中执行时工作得很好。然而,可能是 Bamboo 使用了不同的 shell,或者它对变量做了一些事情。您可以尝试使用echo-maven-plugin 之类的东西来打印竹子通过的确切内容:

<plugin>
    <groupId>com.github.ekryd.echo-maven-plugin</groupId>
    <artifactId>echo-maven-plugin</artifactId>
    <version>1.2.0</version>
    <inherited>false</inherited>
    <executions>
        <execution>
            <id>debug</id>
            <goals>
                <goal>echo</goal>
            </goals>
            <phase>clean</phase>
            <configuration>
              <message>${some.property.password}</message>
            </configuration>
        </execution>
    </executions>
</plugin>

可能会提示您最终值有什么问题(如果有的话)。

还有一个选项(尽管不太可能)您正在配置的插件< someTag ...无法正确读取/解析配置。


推荐阅读