2010-04-07 13 views
22

¿Cómo puedo saber, por ejemplo Tomcat para utilizar una ruta de contexto específica cuando se le da mi WAR-File?Defina el contexto del servlet en el archivo WAR

Tengo un archivo war creado por maven build y el nombre del archivo resultante es bastante largo. Así que no quiero que la aplicación de administrador de tomcat use el nombre de archivo de la guerra como contexto.

El suministro de un context.xml en META-INF no dio los resultados deseados

También encontré esto en la documentación para el atributo de pathContext:

El valor de este campo no debe establecerse excepto cuando se define estáticamente un contexto en server.xml, como se deducirá de los nombres de archivo utilizados para el archivo de contexto .xml o el docBase.

Así que no parece ser la forma correcta de decirle al servidor de aplicaciones cuál debería ser la ruta de mi WAR.

¿Algún consejo más?

Respuesta

28

Hay dos puntos importantes en la documentación de la Context Container:

  • En archivos individuales (con la extensión ".xml") en el directorio $CATALINA_BASE/conf/[enginename]/[hostname]/. El nombre del archivo (menos la extensión .xml) se utilizará como la ruta de contexto. Las rutas de contexto de niveles múltiples se pueden definir usando #, p. Ej. foo # bar.xml para una ruta de contexto de/foo/bar. La aplicación web predeterminada puede definirse utilizando un archivo llamado ROOT.xml.
  • Sólo si un archivo de contexto no existe para la aplicación en el $CATALINA_BASE/conf/[enginename]/[hostname]/, en un archivo individual en /META-INF/context.xml el interior de los archivos de la aplicación. Si la aplicación web se empaqueta como un WAR continuación /META-INF/context.xml se copiarán en $CATALINA_BASE/conf/[enginename]/[hostname]/ y renombrado para que coincida con ruta de contexto de la aplicación. Una vez que este archivo exista, no se reemplazará si se coloca un WAR nuevo con un /META-INF/context.xml más reciente en la base de datos del host.

Así, al combinar un META-INF/context.xml, el archivo se cambia a nombre de la guerra y este nombre se convierte en la ruta de contexto, independientemente de cualquier path definido en el elemento Context.

veo así dos opciones aquí:

  1. Cualquiera de establecer el nombre de la guerra generada a un nombre más corto (se sugiere emplear <finalName> sobre <warName> que está en desuso que yo sepa):

    <project> 
        ... 
        <build> 
        <finalName>mycontext</finalName> 
        ... 
        </build> 
        ... 
    </project> 
    
  2. O utilice maven-tomcat-plugin para la implementación y establezca la ruta de contexto en la configuración del complemento:

    <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

Gracias por el fragmento. La siguiente oración es crítica para mis cosas. Comentario/referencia agregado al archivo context.xml como advertencia para los siguientes desarrolladores. "Una vez que este archivo existe, no será reemplazado si se coloca un nuevo WAR con un /META-INF/context.xml más nuevo en la base de datos del host." – argatxa

4

Puede establecer el atributo path del elemento <Context> de su META-INF/context.xml.

Como alternativa, puede configurar experto para crear el artefacto guerra con un nombre personalizado:

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

Siento ser un disco rayado aquí, pero Definición de la ruta en realidad no trabajar en Tomcat (probado en 6.0.28), como se describe por Pascal anteriormente. – John

+1

He desvalorizado la primera oración porque simplemente no es cierta, la ruta del contexto proviene del nombre del archivo WAR, pero el resto de la respuesta es buena – chrisbunney

+0

@chrisbunney La ruta del contexto proviene del nombre del archivo war de forma predeterminada, pero eso puede ser anulado – Bozho

2

En el proyecto hay una carpeta META-INF, en esa carpeta hay un archivo context.xml.

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

Me gustaría utilizar esta aproximación, pero cuando tomcat descomprime mi guerra, crea una carpeta con el mismo nombre que la guerra, además de crear un archivo .xml en /opt/apache-tomcat-6.0.29/conf/Catalina/localhost/, que es una copia del contexto.xml definido como usted mencionó. ¿Entiendes por qué? – benzen

+0

Estoy de acuerdo - este enfoque ciertamente no funciona en Tomcat 6.0.28 por las razones descritas por Pascal – John

+0

@John, así que ciertamente me funciona cuando compilo una guerra. – Mark

5

Encontré una solución fácil para mantener el nombre del archivo WAR y elegir la ruta de contexto.

Simplemente tiene que desplegar su guerra fuera del Host appBase y crear un enlace dentro del directorio appBase.

Ej. :

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

Ektor

+0

Symlinks brinda la ventaja adicional de una reversión rápida simplemente cambiando el enlace simbólico. –

+1

Esta solución también ayuda a la automatización http://java.dzone.com/articles/super-quick-tomcat-app –

Cuestiones relacionadas