2010-10-29 16 views
16

Sto utilizzando il plug-in di assembly Maven per preparare alcune risorse utente di configurazione per diversi ambienti e sto utilizzando il filtro delle risorse per sostituire i valori dei parametri.Maven - resource filtering: implicazioni del simbolo @ nei file di risorse

mi sono imbattuto in un comportamento strano in cui ho avuto un file di proprietà con il contenuto come segue:


##################### ######

# [email protected] #

########################### #

env.name = $ {replacement.value}


La presenza del simbolo "@" per l'e-mail dell'autore causava l'ignoranza di tutti i riferimenti di proprietà.

Ho provato a cercare la documentazione sul motivo per cui ciò accade, ma non riesco a trovare nulla che risponda a questo comportamento. Qualsiasi suggerimento utile per la documentazione o una spiegazione sarebbe molto apprezzato. Versione

  1. Maven::

    Per riferimento 2.2.1 versione

  2. Maven Assemblea Plugin: 2,2

risposta

28

ho cercato in cerca di documentazione sul motivo per cui questo accade - ma non riesco a trovare nulla che risponda a questo comportamento. Qualsiasi suggerimento utile alla documentazione o una spiegazione sarebbe molto apprezzato.

ciò non sia documentato nella filtering section dell'Assemblea Plugin Maven, ma sembra che utilizza gli stessi delimitatori di default come il Maven Resources Plugin che sono:

<delimiters> 
    <delimiter>${*}</delimiter> 
    <delimiter>@</delimiter> 
</delimiters> 

Così il seguente sarebbe filtrato così:

[email protected]@ 

E questo spiega anche perché un singolo @ l'indirizzo e-mail sta causando problemi (il plugin non trova mai il delimitatore end).

È possibile configurare i delimitatori e una stringa di escape, proprio come quando si utilizza Maven Resources Plugin. Il Maven Assembly Plugin documentation for the single goal fornisce i dettagli.

Una soluzione a basso costo, per questa particolare situazione indirizzo e-mail, sarebbe quella di evitare l'uso di un singolo @ nel file per filtrare:

############################## 
# author.name aT company.com # 
############################## 

env.name=${replacement.value} 

E come un vantaggio, potrai evitare lo spam :)

+10

OMG - Perso 4 ore su questo ed era pronto per uscire dalla programmazione per sempre .... – HDave

+0

Ho provato a usare la dichiarazione del delimitatore e ho avuto errori XSD, il pom è diventato invalido. Anche all'interno di una dichiarazione di plugin di risorse, poiché il plug-in è associato a un ciclo di vita del processo, non è possibile sovrascrivere i valori predefiniti AFAIK. – Cheruvim

9

Ho avuto lo stesso problema ma non ho potuto utilizzare la soluzione alternativa di Pascal dato che @s faceva parte degli script SQL filtrati. Così ho elaborato la soluzione di Pascal e non ho trovato alcun modo su come sovrascrivere i delimitatori di default in Assembly Plugin.Tuttavia, ho trovato un altro post utile (in fondo): http://web.archiveorange.com/archive/v/F1XzEmhzIHiBcpS0RyC6

che suggerisce utilizzando un plugin risorsa correttamente configurato per copiare e filtrare le risorse problematici e quindi utilizzare queste risorse filtrati nel plugin di montaggio. ad esempio: (pom.xml)

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
      <id>copy-resources</id> 
      <phase>process-resources</phase> 
      <goals> 
       <goal>copy-resources</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>target/filtered-resources/scripts</outputDirectory> 
       <resources> 
        <resource> 
         <directory>src/assemble/resources/scripts</directory> 
         <filtering>true</filtering> 
        </resource> 
       </resources> 
       <useDefaultDelimiters>false</useDefaultDelimiters> 
       <delimiters> 
        <delimiter>${*}</delimiter> 
       </delimiters> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

(distribution.xml)

<fileSet> 
    <directory>target/filtered-resources/scripts</directory> 
... 
</fileSet> 
4

ho avuto lo stesso problema, ho usato un po 'di soluzione:

è necessario mantenere '@' char sempre peer aggiungendo una variabile fittizia

########################### 
[email protected] 
[email protected] 
############################ 

env.name=${replacement.value} 
9

È necessario specificare il plugin in modo esplicito nella vostra pom.xml. Implicitamente, sta usando 2.4.1, che ha questo problema. Puoi verificare quale versione di Maven sta usando eseguendo risorse di maven -X: risorse.

Versione 2.6 risolto questo problema.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.6</version> 
</plugin> 
0

Questo funziona seriamente. Definire in un file di proprietà come segue:

@[email protected] 
emaildomain=example.com 

Attempt to set-up an email address using both ${@} and just @. 

domain_email=name${@}${emaildomain} 
domain_email_using_at=name${@}@[email protected] 
[email protected]${emaildomain} 

Results: 
[email protected] 
[email protected] 
[email protected]${emaildomain} 

Questo dovrebbe ottenere punti negativi in ​​quanto è folle che funzioni.

+0

Un modo più pratico sarebbe definire la variabile atsign = @. Anche questo funziona. – Mike

Problemi correlati