web-dev-qa-db-fra.com

Séparer le nom de l'application de guerre du nom du fichier war

Actuellement, si je déploie un fichier war sur Tomcat nommé say myapp.war, je peux accéder à son URL par http: // localhost/myapp/MyServlet .

Cependant, ce que je veux, c'est déployer une guerre avec un numéro de version dans le nom du fichier war et conserver le même URL .Par exemple, je souhaite déployer myapp-1.1.0.war et conserver toujours l'URL http: // localhost/myapp/MyServlet

Bien sûr, je dois continuer à mettre à jour la guerre et le numéro de version ne cessera de changer, je ne peux donc pas coder en dur le nom du fichier war. Existe-t-il un paramètre dans web.xml que je puisse utiliser pour conserver la même URL pour l'application, quel que soit le nom de fichier war?

26
pdeva

La solution consiste à cesser d'utiliser la fonctionnalité de déploiement automatique de Tomcat, qui prend le raccourci permettant de définir le "nom de contexte" (la partie /myapp de l'URL) sur la partie du nom de fichier WAR située avant ".war".

Extrayez vous-même le contenu du fichier WAR sur le système de fichiers et configurez un fichier XML à Tomcat_HOME/conf/[enginename]/[hostname]/[contextname].xml qui pointe le chemin de contexte souhaité (tel que /myapp) vers l'emplacement de l'application sur le disque (tel que /opt/webapps/myapp-1.1.0/).

Les Documents de référence Tomcat fournissent une bonne explication de la manière dont Tomcat déploie les applications automatiquement et explique comment configurer une logique personnalisée pour le mappage du chemin de contexte sur l’emplacement du fichier de l’application celui que je suggère ci-dessus).

14
matt b

Vous pouvez utiliser YOUR_WAR/META-INF/context.xml pour cela. Voici un échantillon: 

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

Lorsque vous utilisez Maven , vous pouvez contrôler le chemin de votre déploiement en procédant comme suit:

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>
...

Commencez par démarrer votre Tomcat, puis construisez et déployez votre application.

mvn clean install Tomcat:deploy

..il sera accessible sous http://server:8080/myWebApp

4
Lorand Bendig

Je préfère utiliser les symboles "##" pour noter la version des fichiers * .war dans Tomcat. 
Par exemple: 
myapp.war -> URL: http: // localhost: 8080/myapp/MyServlet
myapp##1.1.0 -> URL: http: // localhost: 8080/myapp/MyServlet (toujours identique car tous les symboles après "##" sont ignorés par Tomcat)

1
Maksym Pecheniuk

Il n'y a pas de paramètre dans web.xml pour cela. Je ne crois pas qu'il soit possible de placer cela à l'intérieur du fichier war de manière inter-conteneur - il n'en est de toute façon pas fait mention dans les spécifications - donc chaque conteneur le fait différemment. jboss-web.xml, Sun-web.xml, context.xml etc.

1

Je rencontre le même problème et, effectivement, comme @matt mentionné, la documentation de référence Tomcat fournit une bonne explication sur la manière dont Tomcat déploie les applications automatiquement et sur la manière de configurer une logique personnalisée pour le mappage du contexte. chemin d'accès à l'emplacement du fichier d'application.

Dans mon cas, j'ai utilisé ce conseil (dans l'explication 'path'):

Même lors de la définition statique d'un contexte dans server.xml, cet attribut (/path) doit être défini sur not, à moins que la docBase ne soit pas située sous le fichier L'appBase de l'hôte ou les deux deployOnStartup et autoDeploy ont la valeur false. Si cette règle n'est pas suivie, un double déploiement est susceptible de se produire.

ainsi, dans mon cas, j'ai remplacé deployOnStartup et autoDeploy par false. Mon WAR (par exemple, a.WAR) n'était pas automatiquement décomposé en répertoire "a" sous Webapps, mais en répertoire "b", en raison de ces paramètres:

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

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

</Host>
0
OhadR