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