我正在处理一个 Maven 脚本,我必须在其中修改一些文件内容。我目前正在使用替换插件,当替换值包含美元符号时会给我带来麻烦。
我遇到问题的替换相对简单:在我的 log4j.xml 中,将行替换<param name="File" value="wat.log" />
为<param name="File" value="${FOO_BAR}/wat.log" />
我知道,这样写,Maven 会解释${FOO_BAR}
为属性。我查找了一个解决方案并尝试了它。当我只是使用${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 正则表达式替换,它解释替换文本中的美元符号和卷曲,以捕获正则表达式中的组。
我尝试了其他一些事情,似乎这种情况下的具体错误是由于下划线造成的。如果我将foo
属性更改为{FOOBAR}
,则错误会更改:No group with name {FOOBAR}
。
我也尝试了其他一些事情:
- 将
foo
属性更改为{foo}
,我没有收到错误,但替换掉了$
,即我得到value="{foo}/wat.log"
了 - 第二次替换foo
withFOO_BAR
工作,但我仍然缺少美元符号 - 将属性更改为
{dollar}
给我一个Illegal group reference
错误 $$
以几种不同的方式(例如,,\$
)转义美元,大括号和/或下划线\\$
并没有让我更进一步,使用 unicode 或 $ 作为美元符号也没有。
有没有办法用 Maven 实际解决这个问题?我很乐意使用更多属性、更多替换或完全不同的插件。
更新:我在 Windows 上工作 - 不确定这是否/如何影响结果。