6

我正在处理一个 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"了 - 第二次替换foowithFOO_BAR工作,但我仍然缺少美元符号
  • 将属性更改为{dollar}给我一个Illegal group reference错误
  • $$以几种不同的方式(例如,,\$)转义美元,大括号和/或下划线\\$并没有让我更进一步,使用 unicode 或 $ 作为美元符号也没有。

有没有办法用 Maven 实际解决这个问题?我很乐意使用更多属性、更多替换或完全不同的插件。

更新:我在 Windows 上工作 - 不确定这是否/如何影响结果。

4

2 回答 2

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" />

它对我有用。

于 2015-11-16T15:35:33.290 回答
4

我自己找到了答案,寻找与反斜杠相关的另一个问题:添加<regex>false</regex>到替换器插件的配置中,然后替换器将替换它看到的纯文本,并且该${dollar.foo}技巧按预期工作:

<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>
...
于 2015-11-17T14:34:43.273 回答