2010-04-07 10 views
22

Come posso dire ad es. Tomcat per utilizzare un percorso di contesto specifico quando viene fornito il mio file WAR?Definisci contesto servlet nel file WAR

Esempio: Ho un file di guerra creato da maven build e il nome risultante del file è piuttosto lungo. Quindi non voglio che l'applicazione tomcat manager usi il nome file della guerra come contesto.

Fornire un context.xml in META-INF non ha prodotto i risultati desiderati

ho trovato anche questo nella documentazione per l'attributo path di Context:

Il valore di questo campo non deve essere impostato tranne quando si definisce staticamente un contesto in server.xml, poiché verrà dedotto dai nomi file utilizzati per il file di contesto .xml o docBase.

Così non sembra essere il modo giusto per dire l'applicazione-server quale il percorso per la mia guerra dovrebbe essere.

Altri suggerimenti?

risposta

28

Ci sono due punti importanti nella documentazione del Context Container:

  • In singoli file (con estensione ".xml") nella directory $CATALINA_BASE/conf/[enginename]/[hostname]/. Il nome del file (meno l'estensione .xml) verrà utilizzato come percorso di contesto. I percorsi di contesto multilivello possono essere definiti usando #, ad es. foo # bar.xml per un percorso di contesto di/foo/bar. L'applicazione Web predefinita può essere definita utilizzando un file denominato ROOT.xml.
  • Solo se non esiste un file di contesto per l'applicazione nello $CATALINA_BASE/conf/[enginename]/[hostname]/, in un singolo file su /META-INF/context.xml all'interno dei file dell'applicazione. Se l'applicazione Web è impacchettata come WAR, /META-INF/context.xml verrà copiata in $CATALINA_BASE/conf/[enginename]/[hostname]/ e rinominata in modo che corrisponda al percorso di contesto dell'applicazione. Una volta che questo file esiste, non verrà sostituito se una nuova GUER con un nuovo /META-INF/context.xml viene inserita nell'appBase dell'host.

Così, quando si bundle un META-INF/context.xml, il file viene rinominato con il nome della guerra e questo nome diventa il percorso di contesto, a prescindere da qualsiasi path definito nell'elemento Context.

vedo così due opzioni qui:

  1. In entrambi i impostare il nome della guerra generato ad un nome più breve (io suggerisco di usare <finalName> oltre <warName> che è deprecato per quanto ne so):

    <project> 
        ... 
        <build> 
        <finalName>mycontext</finalName> 
        ... 
        </build> 
        ... 
    </project> 
    
  2. Oppure utilizzare lo maven-tomcat-plugin per la distribuzione e impostare il percorso di contesto nella configurazione del plug-in:

    <project> 
        ... 
        <build> 
        ... 
        <plugins> 
         ... 
         <plugin> 
         <groupId>org.codehaus.mojo</groupId> 
         <artifactId>tomcat-maven-plugin</artifactId> 
         <version>1.0-SNAPSHOT</version> 
         <configuration> 
          <path>/mycontext</path> 
         </configuration> 
         </plugin> 
         ... 
        </plugins> 
        ... 
        </build> 
        ... 
    </project> 
    
+1

Grazie per lo snippet. La frase qui sotto è fondamentale per le mie cose. Commento/riferimento aggiunto al file context.xml stesso come avviso per i prossimi sviluppatori. "Una volta che questo file esiste, non verrà sostituito se una nuova GUERRA con un nuovo /META-INF/context.xml viene inserita nell'appbase dell'host." – argatxa

4

È possibile impostare l'attributo path dell'elemento del numero META-INF/context.xml.

In alternativa, è possibile configurare Maven per creare l'artefatto guerra con un nome personalizzato:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <warName>yourCustomWarName</warName> 
      </configuration> 
     </plugin> 
     ........ 
    </plugins> 
</build> 
+4

Mi dispiace essere un disco rotto qui, ma l'impostazione del percorso in realtà non funzionare in Tomcat (testato su 6.0.28), come descritto da Pascal sopra. – John

+1

Preferisco la prima frase perché non è vero, il percorso di contesto proviene dal nome del file WAR, ma il resto della risposta è buono – chrisbunney

+0

@chrisbunney il percorso di contesto viene fornito dal nome del file di guerra per impostazione predefinita, ma ciò può essere sovrascritto – Bozho

2

Nel progetto c'è una cartella META-INF, in quella cartella c'è un file context.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/myproject" /> 
+0

Vorrei usare questo approche, ma quando tomcat decomprime la mia guerra, crea una cartella con il stesso nome della guerra, in più crea un file .xml in /opt/apache-tomcat-6.0.29/conf/Catalina/localhost/, che è una copia del context.xml definito come hai menzionato. Capisci perché? – benzen

+0

Sono d'accordo - questo approccio sicuramente non funziona in Tomcat 6.0.28 per le ragioni descritte da Pascal – John

+0

@John beh, sicuramente funziona per me quando compilo una guerra. – Mark

5

Ho trovato una soluzione semplice per mantenere il nome del file di guerra e scegliere il percorso di contesto.

Devi solo distribuire la tua guerra al di fuori dell'host appBase e creare un collegamento all'interno della directory appBase.

Es. :

ln -sf ${CATALINA_HOME}/wars/myapp-0.0.8-SNAPSHOT.war ${CATALINA_HOME}/webapps/myapp.war 

Ektor

+0

I collegamenti simbolici offrono il vantaggio aggiuntivo di un rapido rollback semplicemente modificando il collegamento simbolico. –

+1

Questa soluzione aiuta anche l'automazione http://java.dzone.com/articles/super-quick-tomcat-app –

Problemi correlati