2011-05-03 17 views
23

Actualmente, si despliego un archivo war en tomcat con el nombre myapp.war, puedo acceder a su url por http://localhost/myapp/MyServlet.Nombre de la aplicación de guerra separador del nombre del archivo de guerra

Sin embargo, lo que quiero es desplegar una guerra con un número de versión en el nombre del archivo war y aún tener la misma url. Por ejemplo, yo desee implementar myapp-1.1.0.war y todavía tienen la url sea http://localhost/myapp/MyServlet

Por supuesto que necesito para mantener la actualización de la guerra y el número de versión va a seguir cambiando, así que no puedo codificar el nombre de archivo de la guerra en cualquier lugar. ¿Hay alguna configuración en web.xml que pueda usar para mantener la misma URL para la aplicación independientemente del nombre de archivo war?

+0

Si lo que desea es añadir una información de versión para su nombre de archivo, verifique mi respuesta a esta pregunta: http://stackoverflow.com/a/33822607/1458639 –

Respuesta

7

Puede usar YOUR_WAR/META-INF/context.xml para esto. Este es un ejemplo:

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

@Matthew Gillard Hasta donde yo sé, los documentos de tomcat dicen que no se debe poner un elemento de contexto en el servidor. xml. No tienen ningún problema con META-INF/context.xml. Los documentos incluso te dicen cómo funciona context.xml. De los documentos: "Los elementos de contexto se pueden definir explícitamente: * En el archivo $ CATALINA_BASE/conf/context.xml: la información del elemento de contexto se cargará por todas las aplicaciones web." –

+2

¿Lo estoy malinterpretando? La sección "ruta" dice: "El valor de este campo no debe establecerse excepto cuando se define estáticamente un contexto en server.xml" –

+0

Creo que el comportamiento de Tomcat (¡y la documentación!) En esta área es muy confuso. No menos importante: si decide que quiere cambiar la raíz de contexto de su aplicación web, debe eliminar manualmente un archivo de $ CATALINA_BASE/conf (4 de 5 puntos en la sección de Introducción de esa página) –

13

La solución es dejar de usar la característica de distribución automática de Tomcat, que toma el atajo de establecer el "nombre de contexto" (la parte /myapp de la URL) a la parte de la guerra nombre de archivo antes de ".war".

En su lugar, extraer el contenido guerra para el sistema de ficheros de configuración de sí mismo y un archivo XML en TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml que apunta la ruta de contexto deseada (como /myapp) a la ubicación de la aplicación en el disco (como /opt/webapps/myapp-1.1.0/). El Tomcat reference docs proporciona una buena explicación de cómo Tomcat despliega aplicaciones automáticamente y cómo puede configurar la lógica personalizada para el mapeo de la ruta de contexto a la ubicación del archivo de la aplicación (hay varias formas alternativas de configurarlo aparte de la ubicación del archivo de la aplicación). Sugiero arriba).

+3

¿significa esto que también tendré que actualizar el archivo .xml cada vez que despliegue una nueva versión de la guerra con el nombre de archivo actualizado? – pdeva

+1

Estoy un poco confundido. en este caso, ¿cuál debería ser el contenido del archivo 'myapp.xml' para que apunte a la ubicación de la guerra? – pdeva

+1

algo como ''. Tomcat utilizará el nombre del archivo, sin la extensión '.xml', como ruta de contexto. También en lo que respecta a mi sugerencia de enlace simbólico, simplemente noté en los documentos que dice 'Si se utiliza un enlace simbólico para docBase, los cambios en el enlace simbólico solo serán efectivos después de reiniciar Tomcat o anulando y redistribuyendo el contexto. Una recarga de contexto no es suficiente. –

1

No hay ninguna configuración en web.xml para esto. No creo que sea posible configurar esto dentro del archivo de guerra de forma cruzada (de todos modos, no se menciona en la especificación), por lo que cada contenedor lo hace de forma diferente. jboss-web.xml, sun-web.xml, etc. context.xml

4

Al utilizar Maven puede controlar el camino de su despliegue realizando lo siguiente:

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

Comience su primera Tomcat A continuación, construir y desplegar su aplicación ..

mvn clean install tomcat:deploy 

..es serán accesibles bajo http://server:8080/myWebApp

+0

@nir gracias por la corrección –

0

me encuentro con el mismo problema, y ​​de hecho, ya mencionado @matt , el Tomcat reference docs proporciona una buena explicación de cómo Tomcat implementa aplicaciones automáticamente y cómo puede configurar la lógica personalizada para la asignación de la ruta del contexto a la ubicación del archivo de la aplicación.

En mi caso, he utilizado este consejo (para explicar su 'camino'):

Incluso cuando se define estáticamente un contexto en el server.xml, este atributo (/ ruta) debe no ajustarse a menos que el docBase no se encuentre debajo de Host's appBase o tanto deployOnStartup como autoDeploy son falsos. Si no se sigue esta regla, es probable que se produzca una implementación doble.

así que en mi caso, me cambiaron tanto deployOnStartup y autoDeploy a falso, por lo que mi GUERRA (egaWAR) no era auto-explotado a 'un' directorio en aplicaciones web, pero en su lugar en el directorio 'b', debido a la estos ajustes:

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

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

</Host> 
Cuestiones relacionadas