2011-06-21 10 views
8

¿Es posible asignar múltiples contextPaths a un archivo WAR en Jetty? Por ejemplo¿Cómo puedo mapear múltiples contextos al mismo archivo war en Jetty?

${jetty.home}/webapp/bookstore.war 

Y luego me gustaría tener dos contextos diferentes que apunten a esta guerra. La razón es que hay algunas diferencias de configuración dependiendo de qué URL se alcanza.

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
</Configure> 

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/books</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
</Configure> 
+0

Suponiendo puede implementar un único archivo de guerra en contextos múltiples, ¿cómo vas a cargar diferentes configuraciones? ¿Basado en el camino? ¿Qué ocurre si el usuario ingresa una URL como http: // myhost/magazines /../ books/...? – mrk

+1

Parece que es mejor que intentes manejar las diferencias a través de una interfaz de Apache, usando los conectores tomcat para dirigir el tráfico a Jetty. – Griff

Respuesta

0

Simplemente puede copiar el archivo war y cambiarle el nombre.

3

Así es como lo hice, y también se configuraron diferentes certificados SSL para cada sitio (no se muestra). No pretendo entender todo lo que sé, pero esto funciona para mí en varias instalaciones. Necesita un archivo "jetty.xml" y un archivo "contexts.xml" para cada instancia.

Supongamos embarcadero está instalado en/opt/embarcadero ...

Lanzamiento dos instancias del servidor de referencia a dos versiones de jetty.xml (esto se puede hacer en una única secuencia de comandos, como se muestra, o en dos separados guiones de lanzamiento)

start.sh ...

cd /opt/Jetty 
java -jar start.jar etc/jetty.xml etc/jetty2.xml 

Si tiene un servidor con múltiples de IP que puede utilizar los archivos context.xml para especificar de diferentes IP o nombres de host en la sección conector de cada muelle. archivo xml Si solo tiene una ip, entonces usará la configuración de la ruta de contexto en el contexto xml para diferenciar entre las dos instancias.

en jetty.xml, consulte la ip o host, y el directorio para contener el context.xml para la primera instancia:

<Call name="addConnector"> 
    <Arg> 
     <New class="org.mortbay.jetty.nio.SelectChannelConnector"> 
     <Set name="host">HOST OR IP FOR FIRST INSTANCE</Set> 
     <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set> 
     <Set name="maxIdleTime">30000</Set> 
     <Set name="Acceptors">2</Set> 
     <Set name="statsOn">false</Set> 
     <Set name="confidentialPort">443</Set> 
     <Set name="lowResourcesConnections">5000</Set> 
     <Set name="lowResourcesMaxIdleTime">5000</Set> 
     </New> 
    </Arg> 
</Call> 
<Call name="addLifeCycle"> 
    <Arg> 
    <New class="org.mortbay.jetty.deployer.ContextDeployer"> 
     <Set name="contexts"><Ref id="Contexts"/></Set> 
     <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_FIRST_instance</Set> 
     <Set name="scanInterval">5</Set> 
    </New> 
    </Arg> 
</Call> 

en jetty.xml, consulte la IP o, y el directorio para contener el context.xml para la segunda instancia:

<Call name="addConnector"> 
    <Arg> 
     <New class="org.mortbay.jetty.nio.SelectChannelConnector"> 
     <Set name="host">HOST OR IP FOR SECOND INSTANCE</Set> 
     <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set> 
     <Set name="maxIdleTime">30000</Set> 
     <Set name="Acceptors">2</Set> 
     <Set name="statsOn">false</Set> 
     <Set name="confidentialPort">443</Set> 
     <Set name="lowResourcesConnections">5000</Set> 
     <Set name="lowResourcesMaxIdleTime">5000</Set> 
     </New> 
    </Arg> 
</Call> 
<Call name="addLifeCycle"> 
    <Arg> 
    <New class="org.mortbay.jetty.deployer.ContextDeployer"> 
     <Set name="contexts"><Ref id="Contexts"/></Set> 
     <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_SECOND_instance</Set> 
     <Set name="scanInterval">5</Set> 
    </New> 
    </Arg> 
</Call> 

Si se define como se muestra arriba, puede volver a cargar el archivo war y reiniciar la aplicación tocando el archivo xml de contexto.

Coloque archivos de contexto separados en subdirectorios separados del directorio de contexto, cada uno apuntando al mismo archivo war, pero con diferentes rutas de contexto y diferentes hosts virtuales.

/opt/Jetty/contexts/subdirectory_for_first_instance/context_first.xml
/opt/Jetty/contexts/subdirectory_for_second_instance/context_second.xml

en context_first.xml - puede especificar un nodo (firstapp) que siempre enlace a su primera aplicación

<Set name="contextPath">/firstapp</Set> 

en context_second.xml - puede especificar un nodo (firstapp) que siempre va a vincular a su segunda aplicación

<Set name="contextPath">/secondapp</Set> 

(Lo anterior es necesario (dos caminos contexto diferente) si desea ejecutar desde la misma IP, creo)

a continuación, definir los dos anfitriones virtuales (debe asignar la dirección URL que está siendo utilizado por el navegador) en los archivos de contexto separados:
en context_first.xml:

<Set name="virtualHosts"> 
    <Array type="String"> 
    <Item>www.my_first_app.com</Item> 
    </Array> 
</Set> 

Y en context_second.xml

<Set name="virtualHosts"> 
    <Array type="String"> 
    <Item>www.my_second_app.com</Item> 
    </Array> 
</Set> 

Nota: si tiene dos IP o nombres de host, se puede establecer la ruta de contexto de ambas aplicaciones a "/"
si sólo tiene una dirección IP, la ruta de contexto determinará qué aplicación se accede

Además, y lo que es más importante, puede enviar parámetros de contexto a su aplicación para que pueda determinar qué instancia es, si es necesario.

Ejemplo de parámetros de contexto para enviar valores únicos para cada instancia:

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
<!-- Custom context configuration         --> 
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
<Set name="initParams"> 
    <New class="java.util.HashMap"> 
    <Put name="customer">Joes Fish Store</Put> 
    <Put name="ShowPanelNames">N</Put> 
    <Put name="FiscalYearStartMonth">10</Put> 
    <Put name="LiveEmail">Y</Put> 
    </New> 
</Set> 
+0

Solución muy bien explicada – Kyle

0

Comprendo que esto es viejo, pero ya que las respuestas proporcionadas en realidad no responder a la pregunta, para referencia futura que puede lograr múltiples WebappContext s utilizando el mismo .war agregando un atributo id al Configure.

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
</Configure> 

<Configure id="booksContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/books</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
</Configure> 

Nota sin embargo que todos los recursos de nombres definidos en el contexto debe atribuirse al contexto utilizando

<Arg> 
    <Ref id="magazinesContext" /> 
</Arg> 

Así que si usted tiene DBCP agrupación de recursos "pg_conn", sin la Arg con la referencia a el ID del WebappContext (en este caso, "revistasContexto" o "booksContext") el Recurso será definido globalmente, es decir, el último WebAppContext cargado gana.

Tomemos por ejemplo el WebappContext definición siguiente, donde "pg_conn" se define a nivel mundial:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource"> 
     <Arg>jdbc/db</Arg> 
     <Arg> 
      <New class="org.apache.commons.dbcp.BasicDataSource"> 
       <Set name="driverClassName">org.postgresql.Driver</Set> 
       <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set> 
       <Set name="username">test</Set> 
       <Set name="password">*****</Set> 
      </New> 
     </Arg> 
    </New> 
</Configure> 

y éste, en el que se define para la instancia de WebappContext:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/magazines</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set> 
    <Set name="extractWAR">true</Set> 
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource"> 
     <Arg> 
      <Ref id="magazinesContext" /> 
     </Arg> 
     <Arg>jdbc/db</Arg> 
     <Arg> 
      <New class="org.apache.commons.dbcp.BasicDataSource"> 
       <Set name="driverClassName">org.postgresql.Driver</Set> 
       <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set> 
       <Set name="username">test</Set> 
       <Set name="password">*****</Set> 
      </New> 
     </Arg> 
    </New> 
</Configure> 
Cuestiones relacionadas