2010-04-07 4 views
22

Wie kann ich z. Tomcat, um einen bestimmten Kontextpfad zu verwenden, wenn er meine WAR-Datei erhält?Servlet-Kontext in WAR-Datei definieren

Beispiel: Ich habe eine Kriegsdatei von Maven Build erstellt und der resultierende Name der Datei ist ziemlich lang. Also ich möchte nicht die Tomcat-Manager-Anwendung den Dateinamen des Krieges als Kontext verwenden.

eine context.xml in META-INF Versorgung hat nicht die gewünschten Ergebnisse produzieren

ich dies auch für die path Attribut Context in der Dokumentation:

Der Wert dieses Feldes darf nicht festgelegt werden, außer wenn ein Context in der Datei server.xml statisch definiert wird, wie aus den Dateinamen für die XML-Kontextdatei oder die docBase abgeleitet werden kann.

Es scheint also nicht der richtige Weg zu sein, dem Anwendungsserver mitzuteilen, wie der Pfad für meinen WAR sein sollte.

Noch weitere Hinweise?

Antwort

28

Es gibt zwei wichtige Punkte in der Dokumentation der Context Container:

  • In einzelnen Dateien (mit einer ".xml" Erweiterung) im $CATALINA_BASE/conf/[enginename]/[hostname]/ Verzeichnis. Der Name der Datei (abzüglich der Erweiterung .xml) wird als Kontextpfad verwendet. Mehrstufige Kontextpfade können unter Verwendung von #, z.B. foo # bar.xml für einen Kontextpfad von/foo/bar. Die Standard-Webanwendung kann mithilfe einer Datei namens ROOT.xml definiert werden.
  • Nur wenn eine Kontextdatei für die Anwendung in der $CATALINA_BASE/conf/[enginename]/[hostname]/ nicht existiert, in einer einzelnen Datei unter /META-INF/context.xml innerhalb der Anwendungsdateien. Wenn die Webanwendung als WAR verpackt ist, wird /META-INF/context.xml in $CATALINA_BASE/conf/[enginename]/[hostname]/ kopiert und umbenannt, um dem Kontextpfad der Anwendung zu entsprechen. Sobald diese Datei existiert, wird sie nicht ersetzt, wenn eine neue WAR mit einem neueren /META-INF/context.xml in der appBase des Hosts platziert wird.

Also, wenn Sie ein META-INF/context.xml bündeln, wird die Datei mit dem Namen der WAR umbenannt und dieser Name wird der Kontextpfad, unabhängig von path im Element Context definiert.

Ich sehe also zwei Möglichkeiten:

  1. Entweder setzen Sie den Namen des generierten Krieg zu einem kürzeren Namen (I <finalName> über <warName> Verwendung vorzuschlagen, die AFAIK ist veraltet):

    <project> 
        ... 
        <build> 
        <finalName>mycontext</finalName> 
        ... 
        </build> 
        ... 
    </project> 
    
  2. Oder verwenden Sie die maven-tomcat-plugin für die Bereitstellung und setzen Sie den Kontextpfad in der Plugin-Konfiguration:

    <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

Vielen Dank für das Snippet. Der folgende Satz ist kritisch für meine Sachen. Kommentar/Verweis wurde der context.xml-Datei selbst als Warnung für die nächsten Entwickler hinzugefügt. "Sobald diese Datei existiert, wird sie nicht ersetzt, wenn eine neue WAR mit einer neueren /META-INF/context.xml in der AppBase des Hosts platziert wird." – argatxa

4

Sie können das path Attribut des Elements <Context> Ihres META-INF/context.xml festlegen.

Alternativ können Sie Maven konfigurieren den Krieg Artefakt mit einem benutzerdefinierten Namen zu erstellen:

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

Leider eine kaputte Schallplatte hier, aber die Einstellung des Pfades nicht wirklich funktioniert in Tomcat (getestet auf 6.0.28) zu sein, wie oben beschrieben, von Pascal. – John

+1

Ich würde für den ersten Satz ablehnen, da es einfach nicht wahr ist, kommt der Kontextpfad aus dem WAR-Dateinamen, aber der Rest der Antwort ist gut – chrisbunney

+0

@chrisbunney der Kontextpfad stammt standardmäßig aus dem War-Dateinamen, aber das kann – Bozho

2

In einem Projekt gibt es einen Ordner META-INF, in diesem Ordner gibt es eine context.xml Datei.

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

Ich möchte diese Approche verwenden, aber wenn Tomcat meinen Krieg entpackt, erstellt er einen Ordner mit dem Der gleiche Name wie der Krieg, und es erstellt eine .xml-Datei in /opt/apache-tomcat-6.0.29/conf/Catalina/localhost/, was eine Kopie der context.xml ist, die Sie definiert haben. Verstehst du warum? – benzen

+0

Ich stimme zu - dieser Ansatz funktioniert sicherlich nicht in Tomcat 6.0.28 aus den von Pascal beschriebenen Gründen – John

+0

@John gut es funktioniert sicherlich für mich, wenn ich einen Krieg kompiliere. – Mark

5

Ich fand eine einfache Lösung, um den Namen der War-Datei zu behalten und den Kontextpfad zu wählen.

Sie müssen nur Ihren Krieg außerhalb des Host bereitstellen und einen Link innerhalb des Verzeichnisses appBase erstellen.

Ex. :

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

Ektor

+0

Symlinks bietet den zusätzlichen Vorteil eines schnellen Rollbacks durch einfaches Ändern des Symlinks. –

+1

Diese Lösung hilft auch bei der Automatisierung http://java.dzone.com/articles/super-quick-tomcat-app –