运行Google maven replacer插件

时间:2015-08-07 21:51:50

标签: maven substitution maven-replacer-plugin

我正在使用Maven 3.2.3。我在我的pom.xml文件中有这个插件......

                    <!-- creates a test database script from the properties file -->
                    <plugin>
                            <groupId>com.google.code.maven-replacer-plugin</groupId>
                            <artifactId>replacer</artifactId>
                            <version>1.5.3</version>
                            <executions>
                                    <execution>
                                            <phase>compile</phase>
                                            <goals>
                                                    <goal>replace</goal>
                                            </goals>
                                    </execution>
                            </executions>
                            <configuration>
                                    <file>src/test/resources/META-INF/db-test-data.sql.templ</file>
                                    <outputFile>target/test-classes/db-test-data.sql</outputFile>
                                    <tokenValueMap>src/test/resources/test.properties</tokenValueMap>
                            </configuration>
                    </plugin>

我注意到当我的“test.properties”文件包含类似的属性

test.sample.school2.name=Middle $ample Elementary #2

插件执行时出现以下错误...

[ERROR] Failed to execute goal com.google.code.maven-replacer-plugin:replacer:1.5.3:replace (default) on project core: Illegal group reference -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.

问题在于替换值中的“$”。如果我删除它,一切都很好。但是,有时替换的值将具有“$”。有没有办法配置插件接受“$”,或者禁止,是否有一个我可以使用的等效插件,它将实现与上面相同的功能?

1 个答案:

答案 0 :(得分:1)

您应该转义$令牌(以及其他此类正则表达式符号):

test.sample.school2.name=Middle \$ample Elementary #2

您知道,$字符用于表示正则表达式替换期间的匹配组(因此出现错误消息)。

这与加载过程中属性文件中的键所需的转义无关,但是此插件可能会为{regex支持提供replaceAll

引用其javadoc

  

请注意替换中的反斜杠(\)和美元符号($)   字符串可能会导致结果与正确的结果不同   被视为字面替换字符串;见Matcher.replaceAll。使用   Matcher.quoteReplacement(java.lang.String)压制特殊   如果需要,这些字符的含义。

但显然,replacer插件的代码并没有使用quoteReplacement来转义任意替换字符串(在这种情况下,它是字符串:{ {1}}),所以你必须自己逃避它。

如果您根本不打算使用正则表达式匹配/替换,可以在插件配置中将"Middle $ample Elementary #2"标记设置为regex

false