Implementar mi aplicación en la raíz en Tomcat

132

Tengo el archivo de guerra de mi aplicación. Necesito implementar esto en el nivel raíz. La URL actual es http://localhost:8080/war_name/application_name.

iamjustcoder
fuente
1
¿Podría especificar cuál es exactamente su problema? Cuando despliega un archivo war en tomcat, se accede a la aplicación usando URL: localhost: 8080 / war_name sin la extensión .war.
ashishjmeshram
1
Sí, tienes razón, necesito acceder a mi aplicación. " Localhost / application_name ", esto puedo acheive cuando estoy el cambio de nombre de mi archivo de la guerra a "ROOT.war", pero su tirando excepción de memoria insuficiente debido a mi tamaño del archivo de la guerra es de alrededor de 120 MB
iamjustcoder
1
@ user661660 - Parece que tienes un problema diferente: cambiar el nombre a ROOT.wardebería funcionar. Sugeriría hacer otra pregunta sobre usted OutOfMemoryException, proporcionando el seguimiento de la pila y los detalles. Probablemente pueda evitarlo configurando -Xmxla JVM.
Rob Hruska
.lang.OutOfMemoryError: PermGen space 16 de marzo de 2011, 9:52:52 a.m. "java.lang.OutOfMemor yError: PermGen space Excepción en el hilo" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG en space 16 de marzo de 2011 9:53:36 a.m. com.ebay.kernel.logger. thread java.lang.OutOfMemoryError: PermGen space Excepción en el thread "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen space
iamjustcoder
1
@ user661660 - Quizás algunas de las respuestas a esta pregunta puedan ayudarlo.
Rob Hruska

Respuestas:

220

Tienes unas cuantas opciones:

  1. Elimine el ROOT/directorio listo para usar de tomcat y cambie el nombre de su archivo war ROOT.warantes de implementarlo.

  2. Despliegue su guerra como (a partir de su ejemplo) war_name.wary configurar la raíz de contexto en conf/server.xmlutilizar el archivo de la guerra:

    <Context path="" docBase="war_name" debug="0" reloadable="true"></Context>

El primero es más fácil, pero un poco más torpe. La segunda es probablemente la forma más elegante de hacerlo.

Rob Hruska
fuente
3
Si Tomcat está configurado para desplegarse automáticamente, no tiene que preocuparse por la opción 2.
Buhake Sindi
44
@Dejel: nada técnicamente. Lo he hecho bastante yo mismo; Se hace el trabajo. Simplemente se siente un poco raro tener que cambiar el nombre de su propio archivo de guerra a algo que sea una especie de detalle de implementación del contenedor.
Rob Hruska
44
Según el enlace que proporcionó NO se recomienda colocar elementos <Context> directamente en el archivo
server.xml
66
Esta respuesta recomienda una técnica que se menciona explícitamente en la documentación como mala forma. La técnica adecuada se detalla aquí: stackoverflow.com/questions/41263245/…
Christopher Schultz
55
+1 por llamarlo ROOT.war. De acuerdo con los documentos de Tomcat, debe tener mucho cuidado al especificar "ruta" para evitar la doble implementación: "Incluso cuando se define estáticamente un Contexto en server.xml, este atributo no debe establecerse a menos que docBase no se encuentre debajo del Host appBase o deployOnStartup y autoDeploy son falsos. Si no se sigue esta regla, es probable que se produzca una doble implementación ". - de tomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward
31

en tomcat v.7 (instalación de vainilla)

en su conf / server.xml agregue el siguiente bit hacia el final del archivo, justo antes de la </Host>etiqueta de cierre:

<Context path="" docBase="app_name">
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Tenga en cuenta que el atributo docBase . Es lo importante. Puede asegurarse de haber implementado app_name antes de cambiar su aplicación web raíz, o simplemente copiar su webapp desempaquetada (app_name) en la carpeta webapps de su tomcat. Inicio, visite root, vea su nombre_aplicación allí.

Peter Perháč
fuente
13

En Tomcat 7 con estos cambios, puedo acceder a myAPP en / y ROOT en / ROOT

<Context path="" docBase="myAPP">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="ROOT" docBase="ROOT">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Agregue arriba a la <Host>sección en server.xml

De repente Palyam
fuente
3
Una ruta de contexto debe ser una cadena vacía o comenzar con un '/'. La ruta [ROOT] no cumple con estos criterios y se ha cambiado a [/ ROOT]
Nikita Bosik
11

Sé que mi respuesta se superpone con alguna de las otras respuestas, pero esta es una solución completa que tiene algunas ventajas. Esto funciona en Tomcat 8:

  1. La aplicación principal se sirve desde la raíz
  2. Se mantiene el despliegue de archivos de guerra a través de la interfaz web.
  3. La aplicación principal se ejecutará en el puerto 80, mientras que solo los administradores tienen acceso a las carpetas de administración (me doy cuenta de que los sistemas * nix requieren superusuario para vincularse a 80, pero en Windows esto no es un problema).

Esto significa que solo tiene que reiniciar el tomcat una vez, y después de que los archivos de guerra actualizados se puedan implementar sin problemas.

Paso 1: en el archivo server.xml, busque la entrada del conector y reemplácela con:

<Connector 
    port="8080"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

Paso 2: definir contextos dentro de la <Host ...>etiqueta:

<Context path="/" docBase="CAS">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/ROOT" docBase="ROOT">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/host-manager" docBase="host-manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Tenga en cuenta que me dirigí a todas las aplicaciones en la carpeta webapp. El primero cambia efectivamente la raíz y la aplicación principal desde la posición. ROOT ahora está activado http://example.com/ROOTy la aplicación principal está activada http://example.com/. Las aplicaciones web que están protegidas con contraseña requieren el privileged="true"atributo

Cuando implementa un archivo CAS.war que coincide con la raíz ( <Context path="/" docBase="CAS">debe volver a cargarlo en el panel de administración, ya que no se actualiza con la implementación.

No incluya el <Context path="/CAS" docBase="CAS">en sus contextos ya que deshabilita la opción del administrador para desplegar archivos de guerra. Esto significa que puede acceder a la aplicación de dos maneras: http://example.com/yhttp://example.com/APP/

Paso 3: para evitar el acceso no deseado a la carpeta raíz y de administrador, agregue una valvea esas etiquetas de contexto como esta:

<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        addConnectorPort="true"
        allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/>
</Context>

Esto esencialmente limita el acceso a la carpeta de la aplicación web de administración a las personas de mi propio dominio (dirección IP falsa) y localhost cuando usan el puerto predeterminado 8080 y mantiene la capacidad de implementar dinámicamente los archivos war a través de la interfaz web.

Si desea usar esto para múltiples aplicaciones que usan diferentes direcciones IP, puede agregar la dirección IP al conector ( address="143.21.2.1").

Si desea ejecutar múltiples aplicaciones web desde la raíz, puede duplicar la etiqueta de Servicio (use un nombre diferente para el segundo) y cambiar la base de documentos de <Context path="/" docBase="CAS">a, por ejemplo <Context path="/" docBase="ICR">.

KimvdLinde
fuente
6

La vía más rápida.

  1. Asegúrese de no tener implementada la aplicación ROOT, anule la implementación si tiene una

  2. Cambie el nombre de su guerra a ROOT.war, despliegue, eso es todo, no se necesitan cambios de configuración

Dima
fuente
6

Remover $CATALINA_HOME/webapps/ROOT. Actualización $CATALINA_HOME/conf/server.xml, asegúrese de que el elemento Host se vea como el siguiente texto:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="" docBase="myApp"></Context>

Funciona con Tomcat 8. AutoDeploy y deployOnStartup deben establecerse en falso para evitar que Tomcat se implemente myAppdos veces.

Jingguo Yao
fuente
Intenté subir la WAR y no funcionó. ¿Es esto solo para los WAR explotados?
logixplayer
Intenté subir la WAR y no funcionó según el ejemplo de @ Jingguo. ¿Es esto solo para los WAR explotados? EDITAR: De hecho, es SOLO para guerras explotadas. ¿Por qué es esto? ¿No puedo simplemente cargar WAR y evitar este doble paso? ¿Cómo puedo hacer que funcione?
logixplayer
@logixplayer. Mi solución funciona con WAR. No lo exploté. Olvidé mencionar que $CATALINA_HOME/webapps/ROOTes necesario eliminarlo. Elimínelo e intente nuevamente.
Jingguo Yao
Quité la RAÍZ como dijiste. Implementé mi WAR (directorio no explotado). Noté que se creó un nuevo directorio ROOT con mis cosas, por ejemplo, WEB-INF. El sitio está funcionando. ¿Es así como se supone que funciona?
logixplayer
También probé este método y todo cuando intento abrir la página en el navegador simplemente sigue esperando al servidor. El catalina.out solo dice que el servidor se inició.
Asu
1

Agregando al sol de @Rob Hruska, esta configuración en server.xml dentro de la sección funciona:

<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>

Nota: override = "true" puede ser necesario en algunos casos.

AV M
fuente
No mencionaste dónde poner esto. La respuesta de @Sudheer Palyam fue útil.
Kannan Ramamoorthy
1

Agregando a la respuesta de @Dima , si está utilizando mavenpara construir su paquete, puede decirle que configure su nombre de archivo WAR ROOTen pom.xml:

<build>
    <finalName>ROOT</finalName>
</build>

Por defecto, tomcatdesplegará la aplicación ROOT.warweb en el contexto raíz ( /).

Ali Tou
fuente
0

Abra la URL del administrador de tomact: - http: // localhost: 8080 / manager / html /
luego, en las aplicaciones, verá que una aplicación que tiene una ruta como "/" se implementa
simplemente Despliegue esto. Cambie el nombre del archivo war de su aplicación como ROOT.war y simplemente colóquelo en la ruta: - inicie su Tomcat No se necesita configuración adicional. Ahora podemos ver la página de inicio de nuestra aplicación o la URL configurada en http: // localhost: 8080
ingrese la descripción de la imagen aquí
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Anurag_BEHS
fuente
-1

En mi servidor estoy usando esto y el autodespliegue de raíz funciona bien:

   <Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true">
        <Alias>www.mysite.com</Alias>
        <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mysite_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
        <Context path="/mysite" docBase="mysite" reloadable="true"/>
    </Host>
Mircea Stanciu
fuente
Esto no se desplegará en / sino en / mysite
tine2k el