我正在处理Maven脚本,我必须修改一些文件内容。我目前正在使用替换器插件,当替换值包含美元符号时,这会给我带来麻烦。
我遇到问题的替换相对简单:在我的log4j.xml中,将行<param name="File" value="wat.log" />
替换为<param name="File" value="${FOO_BAR}/wat.log" />
我知道,像这样写的,Maven会将${FOO_BAR}
解释为属性。我查了solution并试了一下。当我使用${FOO}
<properties>
<dollar>$</dollar>
<foo>{FOO_BAR}</foo>
<dollar.foo>${dollar}${foo}</dollar.foo>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<id>configure-logging</id>
<phase>prepare-package</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<includes>
<include>${my.configDir}/log4j.xml</include>
</includes>
<replacements>
<replacement>
<token>value="wat.log"</token>
<value>value="${dollar.foo}/wat.log"</value>
</replacement>
</replacements>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
结果是错误named capturing group is missing trailing '}'
。据我了解,该插件使用通常的Java正则表达式替换,它解释了替换文本中的美元符号和curlies,用于捕获正则表达式中的组。
我尝试了其他一些东西,看起来这种情况下的具体错误是由于下划线。如果我将foo
属性更改为{FOOBAR}
,则错误会更改:No group with name {FOOBAR}
。
我还尝试了其他一些事情:
foo
属性更改为{foo}
,我没有收到错误,但是替换会丢弃$
,即我得到value="{foo}/wat.log"
- 第二次更换有foo
的{{1}}有效,但我仍然错过了美元符号FOO_BAR
会给我一个{dollar}
错误Illegal group reference
,$$
,\$
)并没有给我带来任何进展,也没有使用unicode或$ for美元符号。有没有办法用Maven实际解决这个问题?我很乐意使用更多属性,更多替换或完全不同的插件。
更新:我正在使用Windows - 不确定是否/如何影响结果。
答案 0 :(得分:9)
你非常接近。只需在$
字符前加上一个转义斜杠:
...
<replacements>
<replacement>
<token>value="wat.log"</token>
<value>value="\${dollar.foo}/wat.log"</value>
</replacement>
</replacements>
...
log4j.xml,之前:
<param name="File" value="wat.log" />
log4j.xml,之后:
<param name="File" value="${FOO_BAR}/wat.log" />
它对我有用。
答案 1 :(得分:3)
我自己找到了答案,寻找与反斜杠相关的另一个问题:
将${dollar.foo}
添加到replacer插件的配置中,然后替换器将替换它看到的纯文本,<properties>
<dollar>$</dollar>
<foo>{FOO_BAR}</foo>
<dollar.foo>${dollar}${foo}</dollar.foo>
</properties>
...
<configuration>
<includes>
<include>${my.configDir}/log4j.xml</include>
</includes>
<!-- don't treat token/value as regular expressions -->
<regex>false</regex>
<replacements>
<replacement>
<token>value="wat.log"</token>
<value>value="${dollar.foo}/wat.log"</value>
</replacement>
</replacements>
</configuration>
...
技巧按预期工作:
{{1}}