Come sostituire un valore in web.xml con Maven proprietà?

Ho un progetto Maven che il download di alcuni test i file nella propria directory di compilazione ./target/files. Questi file dovrebbe quindi essere disponibile per una servlet, che posso facilmente ottenere da specificare il percorso completo come <init-param> della servlet:

<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 di usare il nome del percorso completo e utilizzare un parametro dinamico con la sostituzione? Ho provato le seguenti, ma non ha funzionato:

<param-value>${project.build.directory}/files</param-value>
  • Puoi spiegare più in dettaglio come il progetto scarica il file di test? Che cosa innesca questo? Normalmente problemi di questo tipo sono risolto abilitando il filtro, ma può essere difficile a seconda di come questi file vengono visualizzati.
InformationsquelleAutor dokaspar | 2013-03-12

 

6 Replies
  1. 79

    Aggiungere al vostro pom sezione:

    <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 Maven: Personalizzare web.xml di web-app del progetto per ulteriori dettagli

    • Vedi anche maven.apache.org/plugins/maven-war-plugin/examples/… per ulteriori info
    • Qual è la soluzione che consente la sostituzione?
    • è possibile definire una proprietà nella pom.xml (ad esempio, “<myProp>Moin</myProp>”) e, se hai nella tua web.xml un segnaposto (“${myProp}”) questo verrà sostituito con il valore della vostra proprietà (con “Moin” nel mio esempio)
    • Questo è in realtà sostituire il segnaposto con il valore effettivo pom proprietà, ma dopo la distribuzione di suo dà errore dicendo di java.lang.IllegalArgumentException: impossibile risolvere il segnaposto di primavera.i profili.per.attivo’ in valore stringa “${primavera.i profili.per.active}”. Mentre in .guerra e all’interno della cartella di destinazione il suo nuovo valore. Qualche idea del perché accada così?
    • Io sto avendo lo stesso problema. Sembra che tutti i file vengono copiati sul “warSourceDirectory”. Che significa che il web.xml saranno collocati nella cartella principale. Tuttavia: <webXml> tag di lettura dal WEB originale-INF cartella in cui la proprietà non è sostituito. Provare a “<webXml>src/main/webapp/web.xml</webXml>”
    • Credo che <filtro>vero</filtro> è ciò che fa il trucco della variabile di sostituzione

  2. 6

    Si può semplicemente usare maven filtro risorse:

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

    È anche possibile combinare questo e vorrei filtri alcuni file, mentre altri non saranno 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>

    Mettere appropriato segnaposto nel file che vorresti aver sostituito le cose come ${home}.

    • Questo codice consente di filtri e sostituzione di stringhe in un file XML con i valori definiti nella pom.xml <proprietà> tag o devo utilizzare un file di proprietà?
  3. 4

    È possibile utilizzare Sostituire Il Task Ant per farlo.

    Heres un esempio di Implementazione in cui ho sostituito il tokenkeys in un file di proprietà , adattare in base alle proprie esigenze

    test.proprietà

    [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
    • Meglio usare risorse di filtraggio invece di Ant.
    • Mentre il accettato di rispondere che è meglio per l’effettiva domanda, questo è in realtà esattamente quello che stavo cercando in modo da poter sostituire le versioni per webjar dipendenze nel file html statici. Grazie!
  4. 3

    Penso che si può usare maven-guerra-plugin filteringDeploymentDescriptors opzione per filtrare i descrittori di distribuzione –

    <properties>
        <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
    </properties>
  5. 1

    Codifica maven parametri web.xml non possono lavorare direttamente, perché in fase di esecuzione, quando l’applicazione viene avviata, maven ha finito il suo lavoro e l’applicazione non ha alcuna conoscenza di maven.

    È possibile filtrare alternativa web.xml (vedere maven filtraggio: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html) e utilizzarlo quando si costruisce la guerra (vedi il webXml parametro di guerra documentazione del plugin: http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html)

  6. 0

    Aggiungere maven-war-plugin e impostare <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors> per sostituire il segnaposto durante l’esecuzione mvn package

    <properties>
      <project.build.directory>your path</project.build.directory>
    </properties>
    
    <build>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
        </configuration>
      </plugin>
    </build>

Lascia un commento