2015-11-12 37 views
6

我正在處理Maven腳本,我必須修改某些文件內容。我目前正在使用替代品插件,當替換值包含美元符號時會給我帶來麻煩。Maven替代品:包含美元符號的替換值

替換我有問題,是比較簡單的:在我的log4j.xml,與<param name="File" value="${FOO_BAR}/wat.log" />

我知道,寫這樣的替換線<param name="File" value="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正則表達式替換,該替換解釋了替換文本中的美元符號和曲線以捕獲正則表達式中的組。

我嘗試了一些其他的事情,看起來在這種情況下的具體錯誤是由於下劃線。如果我將foo屬性更改爲{FOOBAR},則錯誤更改爲:No group with name {FOOBAR}

我嘗試了一些其他的東西,以及:

  • 改變foo屬性{foo},我沒有得到一個錯誤,但更換滴$,即我得到value="{foo}/wat.log" - 第二更換fooFOO_BAR的作品,但我還是很想念美元符號
  • 改變屬性{dollar}給了我一個Illegal group reference錯誤
  • 逃離美元,括號和/或下劃線我n幾種不同的方式(例如, $$,\$,\\$)沒有帶給我任何進一步的信息,也沒有使用unicode或$作爲美元符號。

有沒有一種方法可以用Maven實際解決這個問題?我很樂意使用更多的屬性,更多的替代品或完全不同的插件。

更新:我在Windows上工作 - 不確定是否/如何影響結果。

回答

1

,我發現自己的答案,尋找相關的反斜線另一個問題: 添加<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> 
... 
+0

好吧,我很高興看到你的問題得到解決。奇怪的是,根據文檔,該參數控制_token_是否包含任何正則表達式字符。 – Daniel

+0

是的,但似乎令牌中可能存在的正則表達式也觸發了正則表達式捕獲組中的值作爲問題根源的評估。所以文檔有點不清楚。 –

7

你非常接近。只是在前面加上$字符用轉義反斜槓:

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

它爲我工作。

+0

嗯,它不適合我 - 正如我寫的,我試圖逃避美元 –

+0

好吧,也許我錯過了這裏的東西。當我回家時,我會在Github上設置我的項目,讓您看一看。我會盡快給您回覆。 – Daniel

+0

對於它的價值,我的例子可以在https://github.com/dr01g/maven-replace-example.git – Daniel