wake-up-neo.com

Trennen des Kriegsanwendungsnamens vom Kriegsdateinamen

Wenn ich derzeit eine Kriegsdatei mit dem Namen myapp.war auf Tomcat implementiere, kann ich über http: // localhost/myapp/MyServlet auf deren URL zugreifen.

Ich möchte jedoch einen Krieg mit einer Versionsnummer im Kriegsdateinamen bereitstellen und habe immer noch die gleiche URL . Zum Beispiel möchte ich myapp-1.1.0.war bereitstellen und habe immer noch die URL http: // localhost/myapp/MyServlet

Natürlich muss ich den Krieg ständig aktualisieren, und die Versionsnummer wird sich ständig ändern, so dass ich den Kriegsdateinamen nirgendwo hardcode kann. Gibt es in web.xml eine Einstellung, die ich verwenden kann, um die gleiche URL für die App zu behalten, unabhängig vom Kriegsdateinamen?

26
pdeva

Die Lösung besteht darin, die automatische Bereitstellungsfunktion von Tomcat nicht mehr zu verwenden, wodurch der Kontextname (der /myapp-Teil der URL) auf den Teil des WAR-Dateinamens vor ".war" gesetzt wird.

Extrahieren Sie stattdessen die WAR-Inhalte selbst in das Dateisystem und richten Sie eine XML-Datei unter Tomcat_HOME/conf/[enginename]/[hostname]/[contextname].xml ein, die den gewünschten Kontextpfad (wie /myapp) auf den Speicherort der Anwendung auf der Festplatte (wie /opt/webapps/myapp-1.1.0/) verweist.

In den Referenzdokumenten Tomcat finden Sie eine gute Erklärung, wie Tomcat Anwendungen automatisch implementiert und wie Sie eine angepasste Logik für die Zuordnung des Kontextpfads zum Speicherort der Anwendungsdatei konfigurieren können (es gibt mehrere Möglichkeiten, dies anders einzurichten die, die ich oben empfehle).

14
matt b

Dazu können Sie YOUR_WAR/META-INF/context.xml verwenden. Hier ist ein Beispiel: 

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyServlet"/>

Wenn Sie Maven verwenden, können Sie den Pfad Ihrer Bereitstellung folgendermaßen steuern:

Tomcat's conf/Tomcat-users.xml:

<Tomcat-users>
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>

  <user username="root" password="root" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

</Tomcat-users>

~/.m2/settings.xml:

...
<server>
  <id>Tomcat</id>
  <username>root</username>
  <password>root</password>
</server>
...

pom.xml:

...
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>myapp</artifactId>
  <version>1.1.0</version>
  <packaging>war</packaging>
...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>Tomcat-maven-plugin</artifactId>
        <configuration>
          <!-- neglect /html below Tomcat7: -->
          <url>http://server:8080/manager/html</url>
          <!-- Refer to the server settings in your ~/.m2/settings.xml -->
          <server>Tomcat</server>
          <path>/myWebApp</path>
        </configuration>
      </plugin>
      ....
    </plugins>
  </build>
...

Starten Sie zuerst Ihren Tomcat Erstellen Sie anschließend Ihre Anwendung und stellen Sie sie bereit.

mvn clean install Tomcat:deploy

..es wird unter http://server:8080/myWebApp erreichbar sein

4
Lorand Bendig

Ich bevorzuge die Verwendung von "##" - Symbolen, um die Version von * .war-Dateien in Tomcat zu notieren. 
Zum Beispiel: 
myapp.war -> URL: http: // localhost: 8080/myapp/MyServlet
myapp##1.1.0 -> URL: http: // localhost: 8080/myapp/MyServlet (immer noch gleich, da alle Symbole nach "##" von Tomcat ignoriert werden)

1

In web.xml gibt es dafür keine Einstellung. Ich glaube nicht, dass es möglich ist, dies in eine Container-übergreifende Art und Weise in die Kriegsdatei zu setzen - sowieso wird es in der Spezifikation nicht erwähnt - also macht jeder Container dies anders. jboss-web.xml, Sun-web.xml, context.xml usw.

1

Ich bin auf das gleiche Problem gestoßen, und in der Tat, wie @matt erwähnt, bieten die Tomcat-Referenzdokumente eine gute Erklärung dafür, wie Tomcat Anwendungen automatisch implementiert und wie Sie eine angepasste Logik für die Zuordnung von Kontext konfigurieren Pfad zum Speicherort der Anwendungsdatei.

In meinem Fall habe ich diesen Rat verwendet (in 'Pfad' Erklärung):

Auch wenn Sie statisch einen Kontext in server.xml definieren, wird dieses Attribut (/path) muss not gesetzt sein, es sei denn, die docBase befindet sich nicht unter der AppBase von Host oder beide deployOnStartup und autoDeploy sind false. Ob Diese Regel wird nicht befolgt, was wahrscheinlich zu einer doppelten Bereitstellung führt.

in meinem Fall habe ich also sowohl deployOnStartup als auch autoDeploy auf false gesetzt, sodass mein WAR (z. B. a.WAR) nicht automatisch in das a-Verzeichnis unter webapps, sondern aufgrund der folgenden Einstellungen in das 'b'-Verzeichnis aufgelöst wurde:

<Host name="localhost"  appBase="webapps"
            autoDeploy="false" deployOnStartup="false" 
            unpackWARs="true" deployIgnore="${ignore.context}">

   <Context docBase="a" path="/b" />

</Host>
0
OhadR