2015-11-12 17 views
6

Ho a che fare con uno script Maven in cui devo modificare alcuni contenuti del file. Attualmente sto usando il plugin replacer, che mi dà problemi quando il valore di sostituzione contiene i simboli del dollaro.Maven replacer: valore di sostituzione contenente il simbolo del dollaro

La sostituzione ho problemi con è relativamente semplice: nel mio log4j.xml, sostituire la linea <param name="File" value="wat.log" /> con <param name="File" value="${FOO_BAR}/wat.log" />

So che, scritto così, Maven avrebbe interpretato ${FOO_BAR} come proprietà. Ho cercato uno solution e l'ho provato. Quando mi basta usare ${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> 

Il risultato è un errore named capturing group is missing trailing '}'. A quanto ho capito, il plugin utilizza la solita sostituzione regex di Java che interpreta i segni del dollaro e le incurvature nel testo di sostituzione per catturare i gruppi nella regex.

Ho provato alcune altre cose e sembra che l'errore specifico in questo caso sia dovuto al trattino di sottolineatura. Se cambio la proprietà foo su {FOOBAR}, l'errore cambia: No group with name {FOOBAR}.

ho provato un paio di altre cose:

  • modificando la proprietà foo-{foo}, non ottengo un errore, ma la sostituzione gocce del $, cioè ho value="{foo}/wat.log" - una seconda sostituzione di foo con FOO_BAR opere, ma ho ancora mi manca il simbolo del dollaro
  • modificando la proprietà di {dollar} mi dà un errore Illegal group reference
  • fuga il dollaro, bretelle e/o i sottolinea n diversi modi (ad es. $$, \$, \\$) non mi ha portato oltre, né ha utilizzato l'unicode o $ per il simbolo del dollaro.

C'è un modo per risolvere questo con Maven? Sarei felice di usare più proprietà, più sostituzioni o un plugin completamente diverso.

Aggiornamento: Sto lavorando su Windows - non sono sicuro se/come influisce sui risultati.

risposta

1

ho trovato la risposta me stesso, alla ricerca di un altro problema relativo al backslash: Aggiungere <regex>false</regex> alla configurazione del plugin sostituto, poi il sostituto sarà solo sostituire il testo in chiaro che vede e il trucco ${dollar.foo} funziona come previsto:

<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

Ok, sono lieto di vedere risolto il problema. La cosa strana è che secondo la documentazione, quel parametro controlla se il _token_ contiene caratteri regex. – Daniel

+0

Sì, ma sembra che l'eventuale presenza di regex nel token inneschi anche la valutazione dei gruppi di cattura regex nel valore che era la fonte del problema. Quindi i documenti sono un po 'poco chiari su questo. –

7

Sei molto vicino. Basta anteporre il carattere $ con una fuga back-slash:

... 
<replacements> 
    <replacement> 
    <token>value="wat.log"</token> 
    <value>value="\${dollar.foo}/wat.log"</value> 
    </replacement> 
</replacements> 
... 

log4j.xml, prima:

<param name="File" value="wat.log" /> 

log4j.xml, dopo:

<param name="File" value="${FOO_BAR}/wat.log" /> 

Ha funzionato per me.

+0

Beh, non ha funzionato per me - come ho scritto, ho provato questo modo di fuggire dal dollaro –

+0

Ok, forse mi manca qualcosa qui. Preparerò il mio progetto a Github quando torno a casa per dargli un'occhiata. Tornerò da te. – Daniel

+0

Per quello che vale, il mio esempio è disponibile su https://github.com/dr01g/maven-replace-example.git – Daniel

Problemi correlati