2013-03-12 17 views
33

Ho un progetto Maven che scarica alcuni file di test nella sua directory di build ./target/files. Questi file dovrebbero quindi essere a disposizione di un servlet, che posso facilmente raggiungere entro hardcoding il percorso completo come <init-param> del servlet:Come sostituire un valore in web.xml con una proprietà Maven?

<servlet> 
    <servlet-name>TestServlet</servlet-name> 
    <servlet-class>my.package.TestServlet</servlet-class> 
    <init-param> 
     <param-name>filepath</param-name> 
     <param-value>/home/user/testproject/target/files</param-value> 
    </init-param> 
</servlet> 

Come posso evitare hardcoding il percorso completo e utilizzare una sostituzione di parametri dinamici, invece? Ho provato quanto segue, ma non ha funzionato:

<param-value>${project.build.directory}/files</param-value> 
+0

Può spiegare più in dettaglio come il progetto scarica i file di test? Cosa lo innesca? Normalmente problemi come questo vengono risolti abilitando il filtraggio, ma può essere difficile a seconda di come questi file vengono visualizzati. –

risposta

66

Aggiungere alla sezione pom:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration> 
     <webResources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>src/main/webapp</directory> 
       <includes> 
        <include>**/web.xml</include> 
       </includes> 
      </resource> 
     </webResources> 
     <warSourceDirectory>src/main/webapp</warSourceDirectory> 
     <webXml>src/main/webapp/WEB-INF/web.xml</webXml> 
    </configuration> 
</plugin> 

vedere per maggiori dettagli Maven: Customize web.xml of web-app project

+0

Vedere anche https://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html per ulteriori informazioni – tukushan

+4

Cosa c'è nella soluzione che consente la sostituzione? –

+0

@ alikelzin-kilaka: puoi definire una proprietà nel tuo pom.xml (ad es." Moin") e se hai nel tuo web.xml un segnaposto ("$ {myProp}") questo sarà sostituito con il valore della tua proprietà (con "Moin" nel mio esempio) – Steffen

1

Coding parametri Maven in web.xml non possono lavorare direttamente, perché in fase di esecuzione, all'avvio dell'applicazione, Maven ha terminato il suo lavoro e l'applicazione ha nessuna conoscenza su Maven.

È possibile filtrare un web.xml alternativo (vedi filtraggio Maven: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html) e usarlo quando si costruisce la guerra (si veda il parametro webxml la documentazione plugin di guerra: http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)

5

è possibile utilizzare Replace Ant Task per farlo.

Heres un esempio di implementazione in cui sostituisce la tokenkeys in un file di proprietà, adattarlo alle proprie esigenze

test.properties

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

pom.xml

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
     <phase>compile</phase> 
     <configuration> 
      <tasks> 

      <replace dir="${basedir}/src/main/resources" > 
       <include name="**/*.properties"/> 
      <replacefilter  token="@[email protected]" value="My Server"/> 
      <replacefilter  token="@[email protected]" value="My Profile"/> 
      </replace>    

      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

voilà! Ora eseguire

mvn clean package 
+6

Migliore utilizzo [filtro delle risorse] (http://maven.apache.org/plugins/maven -resources-plugin/examples/filter.html) anziché Ant. – khmarbaise

+0

Mentre la risposta accettata è migliore per la domanda vera e propria, questo è esattamente ciò che stavo cercando, così ho potuto sostituire le versioni per le dipendenze webjar in file html statici. Grazie! – Pytry

5

Si può semplicemente utilizzare Maven filtering resources:

<build> 
    ... 
    <resources> 
     <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
     </resource> 
     ... 
    </resources> 
    ... 
    </build> 
    ... 
</project> 

È possibile anche combinare questo e desidera filtrare alcuni file mentre altri non devono essere filtrati:

<resources> 
     <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
     <includes> 
      <include>**/*.xml</include> 
     </includes> 
     </resource> 
     <resource> 
     <directory>src/main/resources</directory> 
     <filtering>false</filtering> 
     <excludes> 
      <exclude>**/*.xml</exclude> 
     </excludes> 
     </resource> 
     ... 
    </resources> 

Inserisci segnaposti appropriati nei file che desideri aver sostituito cose come $ {home}.

+0

Questo codice filtra e sostituisce le stringhe nei file XML con i valori definiti nel tag pom.xml o devo utilizzare un file delle proprietà? – madtyn

1

Penso che si possa utilizzare l'opzione filteringDeploymentDescriptors di Maven-guerra-plugin per filtrare descrittori di deployment -

<properties> 
    <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors> 
</properties> 
Problemi correlati