2011-09-19 20 views
7

Ho un file XML (urlrewrite.xml) che ha bisogno di un segnaposto di proprietà risolto. Abilito il filtraggio Maven per raggiungere questo obiettivo. Funziona bene per il file WAR assemblato.Come filtrare le risorse quando si utilizza il plugin maven jetty?

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

Il problema è quando si tenta di eseguire l'applicazione in modalità di sviluppo utilizzando il Maven-molo-plugin (Maven Jetty Plugin), come Maven pontile: run.

Il file in questione, urlrewrite.xml, si trova nella directory src/main/resources e quindi dovrebbe (e lo fa) finisce in/WEB-INF/classes (o target/classes per maven jetty: run).

L'URLRewriteFilter configurazione specifica la posizione del file di configurazione come segue:

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    <init-param> 
     <param-name>confPath</param-name> 
     <param-value>/WEB-INF/classes/urlrewrite.xml</param-value> 
    </init-param> 
</filter> 

Ciò funzionerà in fase di distribuzione. Tuttavia, usando il plugin maven jetty, URLRewrite morirà con una NullPointerException perché usa context.getResourceAsString ("/ WEB-INF/classes/urlrewrite.xml") per caricare il file di configurazione. Jetty restituisce null per questo perché quando esegue l'applicazione dallo spazio di lavoro risolve/WEB-INF/classes/... in src/main/webapp/WEB-INF/.... Il file non esiste lì perché WAR non è stato ancora assemblato. Dovrebbe invece estrarre la risorsa da target/classes/urlrewrite.xml.

Se questo è oscuro per te, allora probabilmente non sarai in grado di rispondere a questa domanda perché sospetto che dovrai essere un guru del Jetty per capire una soluzione alternativa (suggerimento: è una sfida!).

Qualcuno sa un modo per aggirare questo? Ho anche provato le soluzioni alternative seguenti per conoscere alcun risultato:

  1. Put urlrewrite.xml sotto una nuova directory, src/main/webResources e aggiungerlo al plugin guerra Maven <webReources> e attivare il filtro. Copierà il contenuto nella posizione appropriata quando WAR è in pacchetto, ma non lo renderà disponibile per il jetty: esegui
  2. Alcuni altri hack che non ricordo nemmeno ... (aggiornerò se lo faccio)

in sintesi, Maven-molo-plugin ha bisogno del file di essere sotto src/main/risorse/webapp/via di inserimento e il nome in modo da essere disponibile per il pontile Maven: comando di marcia ...

Grazie per il tuo aiuto ...

Cordiali saluti, Lloyd F orce

risposta

12

Ho risposto alla mia domanda.

  1. aggiornamento Maven-molo-plugin per almeno 6.1.12

  2. Vedere questa pagina wiki su 'Configurazione Directory multiple sorgenti WebApp' (disponibile dal molo-6.1.12.rc2 e pontile-7.0 .0pre3)

  3. Aggiungi un po 'di magia al pom.xml:

In primo luogo, aggiungere una nuova directory (src/main/webResources) per le risorse web filtrati e aggiungere una <risorsa> elemento:

 <resource> 
      <directory>src/main/webResources</directory> 
      <filtering>true</filtering> 
      <targetPath>../jettyFilteredResources</targetPath> 
     </resource> 

che copierà i file di destinazione/jettyFilteredResources (ne parleremo più avanti). Questa directory NON verrà copiata nel tuo file WAR compresso, è solo per il molo!

Aggiungere il seguente elemento al vostro esperto di-guerra-plugin <configurazione> elemento:

   <webResources> 
        <resource> 
         <directory>src/main/webResources</directory> 
         <filtering>true</filtering> 
        </resource> 
       </webResources> 

che garantirà tutto è confezionato per il vostro file WAR reale.

Infine, dire pontile di utilizzare le risorse della vostra copiati soprattutto per esso, dal aggiunto il seguente frammento al <baseResource> elemento:

<baseResource implementation="org.mortbay.resource.ResourceCollection">       
    <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV> 
</baseResource> 

Ora tutto si opera! (Beh, tecnicamente non ho ancora provato la WAR di produzione, ma ... blah ... dovrebbe funzionare anche).

Se qualcuno ha una risposta migliore, lo accetterò a patto che la risposta sia fornita in un lasso di tempo ragionevole (ad esempio 1 giorno).

+0

+1 Per la soluzione di documentazione (ci sono MOLTE domande senza risposta in rete). Se questo funziona per te, accettalo da solo. Solo una parte, hai provato ad aggiungere il profilo esperto di "Sviluppo" con il filtro specializzato delle risorse? Questo è stato un approccio che ho preso per il mio progetto web non-jetty. –

+0

Utilizzare facoltativamente il plug-in maven-replacer e fare in modo che scriva il file sostituito in/WEB-INF/classes/dir. Si assicurerà che la struttura dir esista. – Steven

+0

Per quelli che utilizzano Jetty 9: org.eclipse.jetty.util.resource.ResourceCollection anziché org.mortbay.resource.ResourceCollection – RockMeetHardplace

3

penso che la risposta in questa altra domanda è meglio:

Running resource filters when using jetty:run

In sostanza, invece di correre 'molo mvn: run' devi usare 'pontile mvn: run-esploso'.

L'unico inconveniente è che è necessario creare il file WAR, che in alcuni casi potrebbe essere costoso. Se questo non è un problema per te, allora credo sia meglio.

+0

lasciami dire che run-exploded non è un'opzione; stai parlando di pochi secondi contro diversi minuti; almeno questo era il caso al momento in cui questo post è stato scritto.la soluzione che ho postato sopra ti dà il meglio di entrambi i mondi. sì, è un hack. ma non sanguina affatto nell'applicazione reale. è solo un hack di costruzione che puoi dimenticare una volta impostato. dagli un colpo e fammi sapere cosa ne pensi. Ammetto che la mia risposta è stata un po 'concisa mentre stavo scrivendo per l'esperto utente esperto. Potrei aggiornare con maggiori dettagli se pensi che sarebbe di aiuto. – les2

+0

A meno che non manchi qualcosa, questa risposta ha funzionato per me. – jbird

2

aggiungere questo a pom.xml:

<resources> 
     <resource> 
      <directory>src/main/webapp/WEB-INF</directory> 
      <filtering>true</filtering> 
      <targetPath>../jettyFilteredResources</targetPath> 
     </resource> 
    </resources> 

e questo è il modo incorporato del server Jetty dovrebbe essere simile:

 <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.1.3.v20140225</version> 
      <configuration> 
       <webAppConfig> 
        <descriptor>target/jettyFilteredResources/web.xml</descriptor> 
       </webAppConfig> 
       <scanIntervalSeconds>3</scanIntervalSeconds> 
      </configuration> 
     </plugin> 

woila! grazie @ les2 per l'ispirazione ;-)

+0

Hai dovuto implementare questa funzionalità per il plugin jetty-maven? Se è così, è fantastico. Certamente rende la configurazione necessaria molto più semplice. – les2

0

Ho trovato un altro modo.

creare il progetto e aggiungere la cartella di destinazione come percorso di classe extra.

<webAppConfig> 
    .... 
    <extraClasspath>${basedir}/target/mywebapp</extraClasspath> 
    .... 
</webAppConfig> 
Problemi correlati