Cómo configurar la ruta de contexto de una aplicación web en Tomcat 7.0

162

Sé que puedo cambiar el nombre de mi aplicación web (o es el archivo WAR) a ROOT pero esta es una forma terrible de hacerlo, en mi humilde opinión. Ahora revisé el documento de Tomcat y dice

NO se recomienda colocar elementos directamente en el archivo server.xml

Así que intenté hacerlo con otro método que sugirió.

Los elementos de contexto individuales se pueden definir explícitamente: en un archivo individual en /META-INF/context.xml dentro de los archivos de la aplicación.

Entonces creé un /META-INF/context.xmlcon el siguiente código,

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

Pero después de implementar cuando reinicié el servidor, todavía no pudo cargar el contexto en "/", todavía lo cargó con el "/<WEB_APP_NAME>"

Cualquier puntero útil.

Chantz
fuente
1
La razón "NO se recomienda colocar elementos directamente en el archivo server.xml" que figura en la documentación sigue en la siguiente oración: "Esto se debe a que hace que la modificación de la configuración de contexto sea más invasiva ya que el archivo principal conf / server.xml no puede volver a cargar sin reiniciar Tomcat ". La respuesta aceptada a continuación resuelve directamente el problema, pero si no es probable que modifique esta ruta nuevamente o si los reinicios no son demasiado perjudiciales, modificar el server.xml no parece tan irracional.
rimsky

Respuestas:

236

Lo que puedes hacer es lo siguiente;

Añadir un archivo llamado ROOT.xmlen<catalina_home>/conf/Catalina/localhost/

Este ROOT.xml anulará la configuración predeterminada para el contexto raíz de la instalación de tomcat para ese motor y host (Catalina y localhost).

Ingrese lo siguiente al archivo ROOT.xml;

<Context 
  docBase="<yourApp>" 
  path="" 
  reloadable="true" 
/>

Aquí <yourApp>está el nombre de, bueno, tu aplicación ... :)

Y ahí lo tienes, tu aplicación ahora es la aplicación predeterminada y aparecerá en http://localhost:8080

Sin embargo, hay un efecto secundario; Su aplicación se cargará dos veces. Una vez por localhost:8080y una vez por localhost:8080/yourApp. Para solucionar esto, puede poner su aplicación FUERA <catalina_home>/webappsy usar una ruta relativa o absoluta en la etiqueta docBase de ROOT.xml. Algo como esto;

<Context 
  docBase="/opt/mywebapps/<yourApp>" 
  path="" 
  reloadable="true" 
/>

¡Y entonces todo debería estar bien!

Paaske
fuente
32
Abajo votado? ¿Está bien, pero por qué? Si hay una mejor alternativa, ¡házmelo saber también! : D
Paaske
1
¿Funcionará esto con otras guerras en la carpeta regular webapps?
chrislovecnm
55
Para resolver el despliegue doble, también puede configurar "deployOnStartup" y "autoDeploy" false del atributo Host en el server.xml
Sefler
8
He descubierto que si no cambia el nombre de la carpeta ROOT predeterminada en / webapps "el gato regresa" y restablece docBase en ROOT.xml. Esto es con el servidor de desarrollo vfabric tc de VMWare ... Tenga cuidado.
hoserdude
3
Parece que Tomcat 7 no permitirá un docBase dentro / webapps ahora, por lo que parece ser obligatorio ubicar el archivo de guerra en otro lugar.
Mojo
12

Aquí sigue las únicas soluciones que funcionaron para mí. Agregue esto al nodo Host en conf / server.xml

<Context path="" docBase="yourAppContextName">

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

vaya al archivo Tomcat server.xml y configure la ruta en blanco

rodvlopes
fuente
1
será en server.xmlo context.xml? veo una etiqueta xml <Context>en micontext.xml
Saif
66
También hay una etiqueta xml de contexto en server.xml. Sin embargo, se desaconseja el uso de server.xml para la definición de contexto
Ismail Yavuz
4

En Tomcat 9.0, solo tengo que cambiar lo siguiente en el server.xml

<Context docBase="web" path="/web" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

a

<Context docBase="web" path="" reloadable="true" source="org.eclipse.jst.jee.server:web"/>
MK Yung
fuente
3

Este pequeño código funcionó para mí, usando hosts virtuales

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>
Jorge Sanchez
fuente
Esto esta adentro server.xml? Según, por ejemplo, Ali.Mojtehedy anterior eso es problemático. Además, otras respuestas indican que /path/todebe estar fuera del camino normal de las aplicaciones web.
Jean Jordaan
Parece funcionar bien. Por supuesto, no desea que la aplicación ROOT exista en la misma carpeta webapps para entrar en conflicto con la suya.
Anthony Hayward
2

Lo más rápido y puede ser la mejor solución es tener el siguiente contenido en <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

Y tu aplicación web estará disponible en http://<host>:<port>/

Rajesh Gheware
fuente
1
¿Es ese directorio docBase absoluto o relativo a una carpeta específica?
Jose Martinez
3
Intenté esto, pero no funciona. Tengo una aplicación llamada Foobaren /opt/tomcat/webapps/Foobar. Intenté configurar docBase Foobary también /opt/tomcat/webapps/Foobar, pero cuando voy a `http: // <host>: <port> / todavía veo la página de inicio de Tomcat en lugar de mi aplicación Foobar. Incluso reinicié Tomcat. ¿Qué estoy haciendo mal?
kimbaudi
Cuando hago el camino nulo, no llega a mi aplicación):
Snickers3192
1

Me enfrenté a este problema durante un mes. Poner la etiqueta de contexto dentro de server.xml no es seguro, afecta a los elementos de contexto que se implementan para todos los demás hosts, para las aplicaciones grandes se necesitan errores de conexión y tampoco un buen aislamiento, por ejemplo, puede acceder a otros sitios por nombre de carpeta dominio2 .com / domain1Folder !! ¡también las conexiones de la sesión de la base de datos se cargaron dos veces! la otra forma es poner el archivo ROOT.xml que tiene una etiqueta de contexto con una ruta completa como:

 <Context path="" docBase="/var/lib/tomcat7/webapps/ROOT" />

en conf / catalina / webappsfoldername e implemente war file como ROOT.war dentro de webappsfoldername y también especifique host como

 <Host name="domianname"  appBase="webapps2" unpackWARs="true"  autoDeploy="true"  xmlValidation="false" xmlNamespaceAware="false" >

        <Logger className="org.apache.catalina.logger.FileLogger"
               directory="logs"  prefix="localhost_log." suffix=".txt"
          timestamp="true"/>
</Host>

¡En este enfoque también para las sesiones de usuario de aplicaciones del mismo tipo no tiene un buen aislamiento! puede ingresar a app1 si app1 es igual que app2, luego de iniciar sesión en la sesión del lado del servidor, ¿puede iniciar sesión automáticamente en app2? ¡Entonces debe mantener la sesión de los usuarios en el caché del lado del cliente y no con jsessionid! Podemos cambiar el nombre del motor de localhost para resolverlo. ¡pero digamos que jugar con tomcat necesita más tiempo que jugar con otros gatos!

Ali.Mojtehedy
fuente
1

No se recomienda actualizar la configuración del servidor como server.xml o ROOT.xml.

Puede colocar un archivo de configuración context.xml en el directorio META-INF de su aplicación web, con la configuración de ruta de contexto incluida. ¿Esto anulará la configuración predeterminada del servidor?

es decir:

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">
Ivan
fuente
1

<Context docBase="yourAppName" path="" reloadable="true">

vaya al archivo Tomcat server.xml y configure la ruta en blanco

Vipin Yadav
fuente
1

Tomcat 8: después de muchas búsquedas, esto solo funciona: en server.xml

<!-- Set /apple as default path -->
    <Host name="localhost"  appBase="webapps"
         unpackWARs="true" autoDeploy="true">
     <Context path="" docBase="apple">
         <!-- Default set of monitored resources -->
         <WatchedResource>WEB-INF/web.xml</WatchedResource>
     </Context>
    </Host>

Reinicie Tomcat, asegúrese de que cuando acceda a 127.0.0.1:8080, se mostrará el contenido en 127.0.0.1:8080/apple

Mi proyecto fue una aplicación web de Java creada por netbeans, configuré la ruta de contexto en la configuración del proyecto, nada más, incluso puse apple.war en la carpeta webapps.

usuario3600935
fuente
1

Para mí ambas respuestas funcionaron.

  1. Agregar un archivo llamado ROOT.xml en / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Agregar entrada en server.xml
<Service name="Catalina2">
    <Connector port="8070" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8743" />
    <Engine name="Catalina2" defaultHost="localhost">
        <Host name="localhost"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="/tmp/wars/hpong"  reloadable="true">
                <WatchedResource>WEB-INF/web.xml</WatchedResource>
            </Context>
      </Host>
    </Engine>
</Service>

Nota: cuando declara docBase en contexto, ignore appBase en el host.

  1. Sin embargo, he preferido convertir mi nombre de guerra como ROOT.wary colocarlo debajo de webapps. Entonces, ahora las solicitudes de URL incomparables de otras guerras (contextpaths) aterrizarán en esta guerra. Esta es una mejor manera de manejar la ruta de contexto ROOT ("/ **").

La segunda opción es (doble) cargar las guerras desde la carpeta Webapps también. También solo necesita una carpeta de guerra sin comprimir, lo cual es un dolor de cabeza.

Kanagavelu Sugumar
fuente
1

En Tomcat 8.X, en la carpeta / conf / directorio principal de tomcat en server.xml, puede agregar una <Context>etiqueta debajo de la <Host>etiqueta como se muestra a continuación. Pero debe reiniciar el servidor para que surta efecto

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

     <Context docBase="${catalina.base}\webapps\<Your App Directory Name>" path="<your app path you wish>" reloadable="true" />
  </Host>

O si está utilizando Tomcat 7.X, puede agregar el archivo context.xml en la carpeta WEB-INF en su proyecto. El contenido del archivo que utilicé es como se muestra. y funcionó bien para mí No es necesario reiniciar el servidor en este caso.

<?xml version="1.0" encoding="UTF-8"?>

<Context docBase="${catalina.base}\webapps\<My App Directory Name>" path="<your app path you wish>" reloadable="true" />
harsha kumar Reddy
fuente
Probado en tomcat: 9.0 docker y funciona como 8.0 que mencionaste. localhost:8080/<Your App Directory Name>/y localhost:8080/<your app path you wish>/estas dos URL funcionan al mismo tiempo. Encontré estas dos carpetas extraídas debajo $CATALINA_HOME/webapps/.
niaomingjian
1

La solución más simple y flexible se encuentra a continuación: Inside $ {Tomcat_home} /config/server.xml

Cambie autoDeploy = "false" deployOnStartup = "false" en el elemento Host como se muestra a continuación. Esto es obligatorio.

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="false" deployOnStartup="false">

Agregue debajo de la línea debajo del elemento Host .

<Context path="" docBase="ServletInAction.war"  reloadable="true">
            <WatchedResource>WEB-INF/web.xml</WatchedResource>
        </Context>

Con el enfoque anterior, podemos agregar tantas aplicaciones bajo aplicaciones web con diferentes nombres de ruta de contexto.

Ravi Gupta
fuente
La solución alternativa sin hacer la configuración anterior es simplemente cambiar el nombre del archivo war a root.war y colocarlo en el directorio webapps. La ruta de contexto automática se establecerá en /.
Ravi Gupta
-6

El siguiente truco funcionó para mí.

1) Comente / elimine la siguiente configuración del archivo server.xml (dentro de la carpeta conf) de tomcat.

2) Elimine la carpeta ROOT existente (si existe) que reside dentro de la carpeta tomcat webapps. Y cambie el nombre de su archivo war (por ejemplo: test.war) a ROOT.war.

Recuerde que al cambiar el nombre del archivo de guerra a ROOT.war "ROOT" debe estar en mayúsculas.

Limitación: puede implementar solo una aplicación dentro de una instancia de Tomcat.

Kulshrest Gautam
fuente
3
De la pregunta: "Sé que puedo cambiar el nombre de mi aplicación web (o es el archivo WAR) a ROOT pero esta es una forma terrible de hacerlo, en mi humilde opinión".
Jean Jordaan
1
No me gustaría limitarme a usar una sola aplicación web por instancia de tomcat.
Ulrich