2013-03-18 11 views
7

tomcat7-maven-plugin consente di eseguire il progetto corrente come applicazione Web e di specificare <webapps> aggiuntivo che verrà caricato simultaneamente in tomcat.Tomcat - Plugin per Maven: esegue webapps ma non progetto corrente

Il mio progetto non è un'applicazione Web, ma accede ai servizi forniti dalle applicazioni web. Quindi, come è possibile distribuire un numero di webapps senza eseguire il progetto stesso come webapp? Il seguente frammento di codice Maven restituisce FileNotFoundExceptions perché non è possibile trovare un contesto.xml.

<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat7-maven-plugin</artifactId> 
    <version>2.0</version> 
    <executions> 
    <execution> 
     <id>run-tomcat</id> 
     <phase>${tomcat.run.phase}</phase> 
     <goals><goal>run-war-only</goal></goals> 
     <configuration> 
     <webapps> 
      <webapp> 
      <contextPath>/my/app1</contextPath> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>war</type>  
      <asWebapp>true</asWebapp> 
      </webapp> 
      ... possibly more webapps ... 
     </webapps> 
     </configuration> 
    </execution> 
    <execution> 
     <id>tomcat-shutdown</id> 
     <phase>${tomcat.shutdown.phase}</phase> 
     <goals><goal>shutdown</goal></goals> 
    </execution> 
    </executions> 
</plugin> 

Soluzione:

Anche se l'applicazione in sé non è una webapp, è necessario configurare un path e un contextFile per esso:

<configuration> 
    <path>/my/non/existing/webapp</path> 
    <contextFile>src/test/resources/context.xml</contextFile> 
    <webapps> 
    ... 

Il context.xml file specificato deve esistere . Di seguito ha lavorato per me, anche se il file web.xml non esiste:

<?xml version="1.0" encoding="utf-8"?> 
<Context path="/my/non/existing/webapp"> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
</Context> 
+0

puoi pubblicare i log rilevanti dell'output Maven? – ben75

+0

Allora, Dominik, hai una risposta poco più di un'ora dopo aver postato la tua domanda ma non hai la cortesia di rispondere? –

+0

Ho aggiunto una soluzione alternativa che risolve il problema. Ma spero ancora che ci sia un modo migliore per farlo ... – dokaspar

risposta

6

Questo è probabilmente abusare del Maven Tomcat plug ma qui è una soluzione che ho trovato. BTW la tua finta soluzione di file di contesto non ha funzionato per me perché avevo bisogno di eseguire una webapp diversa e la mia app è anche una webapp.

C'è una jira là fuori che fornirebbe una soluzione migliore al nostro problema. Vedi https://issues.apache.org/jira/browse/MTOMCAT-228. Ora sulla mia soluzione ...

Per prima cosa, è necessario copiare la guerra in una directory. Suggerisco la directory di destinazione in modo che possa essere facilmente pulita. A seconda che tu voglia sostenere la corsa o gli obiettivi della guerra runica dipende dal fatto che copi solo la guerra o copi la guerra e la spacchetti.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>${maven-dependency-plugin.version}</version> 
    <executions> 
    <execution> 
     <id>copy-war</id> 
     <goals> 
     <goal>copy</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>org.foo</groupId> 
      <artifactId>bar</artifactId> 
      <version>${bar.version}</version> 
      <type>war</type> 
      <overWrite>true</overWrite> 
      <outputDirectory>${project.build.directory}/bar/</outputDirectory> 
      </artifactItem> 
     </artifactItems> 
     <stripVersion>true</stripVersion> 
     </configuration> 
    </execution> 
    <execution> 
     <id>copy-war-unpack</id> 
     <goals> 
     <goal>unpack</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>org.foo</groupId> 
      <artifactId>bar</artifactId> 
      <version>${bar.version}</version> 
      <type>war</type> 
      <overWrite>true</overWrite> 
      <outputDirectory>${project.build.directory}/bar/bar</outputDirectory> 
      </artifactItem> 
     </artifactItems> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Successivamente, è necessario configurare i plugin Tomcat a guardare la directory o guerra che appena copiato al passaggio precedente. Quanto segue mostra una configurazione per tomcat 6 & 7 che è identica diversa dall'ID artefatto.

<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat6-maven-plugin</artifactId> 
    <version>${tomcat6-maven-plugin.version}</version> 
    <configuration> 
    <port>8090</port> 
    <path>${default.rice.context.path}</path> 
    <warDirectory>${project.build.directory}/bar/bar.war</warDirectory> 
    <warSourceDirectory>${project.build.directory}/bar/bar</warSourceDirectory> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat7-maven-plugin</artifactId> 
    <version>${tomcat7-maven-plugin.version}</version> 
    <configuration> 
    <port>8090</port> 
    <path>${default.rice.context.path}</path> 
    <warDirectory>${project.build.directory}/bar/bar.war</warDirectory> 
    <warSourceDirectory>${project.build.directory}/bar/bar</warSourceDirectory> 
    </configuration> 
</plugin> 

essere chiaro che non è necessario configurare warDirectory o bisogno di esecuzione copia-guerra, se si desidera solo per supportare Tomcat: run. Viceversa, non è necessario configurare warSourceDirectory o aver bisogno di eseguire l'esecuzione di unpack-copy-war se si desidera solo supportare tomcat: run-war.

Una nota finale, la copia soluzione dipendenza funziona bene anche con il plugin Jetty Maven quindi se si voleva per supportare sia Tomcat & molo questo potrebbe essere un buon modo per farlo.

+0

BTW. Ho fatto un pasticcio con cose diverse come file serverXml esterni, file di contesto e varie configurazioni. Questo è l'unico modo in cui sono riuscito a far sì che il plugin tomcat NON distribuisse la webapp corrente. –

+0

Ho provato lo stesso senza decomprimere l'archivio di guerra, solo usando il tag wsdlFile. Ma ottieni lo stesso errore. :( – Cherry

+0

Ottima soluzione! Tuttavia, se il tipo di progetto è diverso da 'war', devi forzare il plugin di tomcat a saltare un controllo con' ignorePackaging = true'. Nel mio caso, stavo costruendo un jar che necessitava di un servizio deriso (war) per fare alcuni test di integrazione: ho usato 'dependency: copy' mojo e ho usato' warDirectory = $ {project.build.directory} '/' warFile = mywar.war' e tutto funziona perfettamente – jmelanson

2

Ho appena avuto un'altra idea su come risolvere questo problema in modo simil-maven. Volevo documentarlo qui perché questo potrebbe aiutare gli altri. Non ho ancora testato questa soluzione, ma non vedo ragioni per cui non funzionerebbe.

In sostanza, se si vuole lanciare una webapp "diverso" da quello corrente utilizzando molo o Tomcat plugin che cosa si può fare è questo:

Creare un altro modulo Maven nel progetto. Questo modulo sarà un overlay di guerra vuoto della webapp che vuoi lanciare. Quindi puoi mettere tutte le tue configurazioni di jetty o tomcat in quel nuovo modulo (o semplicemente centralizzare la configurazione di jetty e tomcat nel genitore principale sotto pluginManagement).Poiché, il molo & tomcat è progettato per avviare l'applicazione "corrente", non sono richieste configurazioni speciali compromesse.

+0

Sembrava un grande hack, ma sfortunatamente il plugin Tomcat Maven risulta avere un supporto di overlay piuttosto limitato.Vedi ad esempio questo thread: https://mail-archives.apache.org/mod_mbox/tomcat-users/201204.mbox/%3CCANyrOm6g=a41ufKBfncxd6PvGSUA1M+-nWURpLDKxpBcDOhgJg @ mail.gmail.com% 3E –

+0

Oh sì, mi sono imbattuto anche nei problemi di overlay. Prego invertire i numerosi problemi di sovrapposizione JIRA. Spero che li risolvano per la loro versione 3.0 che probabilmente uscirà a supporto di tomcat 8. https://issues.apache.org/jira/browse/MTOMCAT –

Problemi correlati