2013-03-12 4 views
33

Ich habe ein Maven-Projekt, das einige Testdateien in sein Build-Verzeichnis ./target/files herunterlädt. Diese Dateien sollten dann auf ein Servlet zur Verfügung, die ich von hartzucodieren den vollständigen Pfad als <init-param> des Servlets leicht erreichen kann:Wie ersetzt man einen Wert in web.xml durch eine Maven-Eigenschaft?

<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> 

Wie kann ich hartzucodieren den vollständigen Pfad zu vermeiden und einen dynamischen Parameter Ersatz stattdessen verwenden? Ich habe versucht, die folgenden, aber es hat nicht funktioniert:

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

Können Sie näher erläutern, wie Ihr Projekt die Testdateien herunterlädt? Was löst das aus? Normalerweise werden Probleme wie diese durch Aktivieren der Filterung gelöst, aber es kann schwierig sein, abhängig davon, wie diese Dateien angezeigt werden. –

Antwort

66

zu Ihrem pom Abschnitt hinzufügen:

<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> 

Siehe Maven: Customize web.xml of web-app project für weitere Details

+0

Siehe auch https://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html für weitere Informationen – tukushan

+4

Was ist in der Lösung, die den Ersatz ermöglicht? –

+0

@ alikelzin-kilaka: Sie können eine Eigenschaft in Ihrer pom.xml definieren (z." Moin") und wenn Sie in Ihrer web.xml einen Platzhalter ("$ {myProp}") haben, wird dieser durch den Wert Ihrer Eigenschaft ersetzt (mit "Moin" in meinem Beispiel) – Steffen

1

Coding Maven Parameter in web.xml nicht direkt arbeiten können, weil während der Laufzeit, wenn die Anwendung gestartet wird, Maven hat seine Arbeit und die Anwendung beendet hat kein Wissen über Maven.

Sie können eine alternative web.xml filtern (siehe Maven-Filterung: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html) und es verwenden, wenn Sie den Krieg bauen (siehe webxml Parameter in der Dokumentation Krieg Plugin: http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)

5

Sie Replace Ant Task es tun können.

Heres eine Beispielimplementierung, wo ich die tokenkeys in einer Eigenschaft Datei zu ersetzen, anpassen Ihre Bedürfnisse

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> 
anpassen

voila! Jetzt

mvn clean package 
+6

Bessere Verwendung [Ressourcen Filterung] (http://maven.apache.org/plugins/maven -resources-plugin/examples/filter.html) anstelle von Ant. – khmarbaise

+0

Während die angenommene Antwort für die eigentliche Frage besser ist, ist dies genau das, wonach ich gesucht habe, damit ich Versionen für Webjar-Abhängigkeiten in statischen HTML-Dateien ersetzen kann. Vielen Dank! – Pytry

5
ausführen

Sie einfach Maven filtering resources verwenden können:

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

Sie können dies auch kombinieren und möchten einige Dateien filtern, während andere nicht gefiltert werden sollen:

<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> 

Setzen Sie geeignete Platzhalter in die Dateien, die Sie gerne ersetzen würden, wie $ {home}.

+0

Dieser Code filtert und ersetzt Zeichenfolgen in XML-Dateien mit den Werten, die im Tag pom.xml definiert sind, oder muss ich eine Eigenschaftendatei verwenden? – madtyn

1

Ich glaube, Sie filteringDeploymentDescriptors Option Maven-Krieg-Plugins Deployment-Deskriptoren filtern können -

<properties> 
    <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors> 
</properties> 
Verwandte Themen