2009-10-07 11 views
10

En nuestra compañía, tenemos un número de módulos diferentes construidos como guerras separadas. Cada cliente puede escoger y elegir el módulo que desea comprar. Dado que todos los módulos comparten la misma sesión, el contexto de seguridad, etc., tiene sentido fusionarlos en una sola guerra.¿Cómo unir guerras en una?

¿Es posible automatizar este proceso? Por ejemplo, debería fusionar web.xml, calcular las dependencias de cada guerra, copiar archivos como .jsp y .class, etc. Por cierto, estamos usando Maven, pero no hemos podido encontrar una solución a este problema.

Respuesta

7

concedió a los riesgos mencionados por djna y ChssPly76, es posible ser capaz de lograr esto mediante el uso de superposiciones con el Maven WAR plugin. Esto requerirá que separe las asignaciones de servlets para asegurarse de que no tenga colisiones de URL y cosas por el estilo, pero podría ser el truco.

Básicamente, usted crea un módulo con múltiples dependencias WAR y usa el complemento para fusionarlas en una nueva.

+0

Eso funciona para casi todos los archivos (no clashin g) provenientes de las diferentes guerras de webapp. ¿Conoces una forma de unir los diferentes archivos web.xml? –

1

Es claramente posible hacer esto, pero creo que sería mejor trabajar en una sola GUERRA en primer lugar. El "pick-and-mix" tardío de los contenidos de WAR me suena como una pesadilla de soporte.

+1

Si el cliente no compra el módulo, entonces no quiero distribuir el módulo al cliente (y recurro a esconderlo ...). Además, dicha guerra sería enorme, eso sería muy poco práctico para fines de desarrollo, etc. – Dan

0

En general, no, no es posible. ¿Qué pasa si tienes nombres JSP duplicados? Nombres de los servlets/mappings? Los mismos receptores de contexto cargan con diferentes parámetros (¿es común si está utilizando Spring/Struts/etc ...)? Tú entiendes.

En su caso particular, puede o no ser posible dependiendo de sus circunstancias específicas. Es fácil extraer guerra y copiar JSP/classes/libraries; fusionar web.xml es un poco más complejo ya que debe mantener el orden de los elementos; puede ser más fácil definir manualmente un web.xml "fusionado".

+0

Estaría encantado de tener la herramienta que aborta si se descubren algunos de estos conflictos. – Dan

+0

Creo que una política podría manejar esos enfrentamientos directos de nombres (las superposiciones usan una política de "primeros triunfos", aunque una "guerra que incluya los triunfos de la subguerra" tendría más sentido para mí. Quiero hacer esto y fusionar web- xmls y tienen servlets y filtros de sub-guerra mapeados y disponibles en el resultado. Si hay un choque entre el nombre del servlet o el mapeo del servlet, entonces tenga una política para resolver el conflicto como se mencionó anteriormente. Muy útil cuando tiene una plataforma base que desea combinar en diferentes proyectos de fin/productos. –

-1

Es posible que pueda obtener algo que funcione con One-Jar.

http://one-jar.sourceforge.net/

Probablemente no hace todo lo que quiere.

+0

una jarra no funcionará con las guerras. –

4

Recuerdo que el cargo-maven2-plugin tiene un uberwar mojo. No lo he usado pero entiendo que está destinado a unir guerras, aunque debes tener cuidado para evitar conflictos.

Un escaneo rápido de la fuente indica que define un merge descriptor para determinar cómo combinar las guerras. Desafortunadamente, el documentation site ha desaparecido, así que no puedo darle más detalles.

Puede consultar el sitio Codehaus Jira para conocer su estado actual.

Para utilizar el complemento que especificar la configuración de algo como esto:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.cargo</groupId> 
     <artifactId>cargo-maven2-plugin</artifactId> 
     <version>1.0</version> 
     <extensions>true</extensions> 
     <configuration> 
     <descriptor>merge.xml</descriptor> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
    <groupId>project1.groupId</groupId> 
    <artifactId>project1</artifactId> 
    <type>war</type> 
    <version>1.0.0</version> 
    </dependency> 
    <dependency> 
    <groupId>project2.groupId</groupId> 
    <artifactId>project2</artifactId> 
    <type>war</type> 
    <version>1.2.0</version> 
    </dependency> 
</dependencies> 

(todavía en busca de un ejemplo merge.xml)

+0

@Pascal tiendo a estar de acuerdo, pero si no hay ninguna opción de refactorizar, esto proporciona una solución –

+0

@Rich Claro, eso es cierto y me dio eres mi +1. Eliminé mi comentario anterior, ya que puede malinterpretarse. –

+2

Ver http://cargo.codehaus.org/Merging+WAR+files –

1

Los EAR están diseñados para contener varias cosas. ¿Esta sería una posibilidad para ti?


Editar: En primer lugar, vamos a suponer que no hay recursos duplicados (que uno debe ir en el frasco final?) Y que todos los frascos son compatibles (sólo tiene una versión de cada biblioteca, etc.) .

Debería poder simplemente copiar el contenido de WEB-INF/uno encima del otro, excepto los diversos archivos XML que deben fusionarse cuidadosamente. La forma más sencilla de hacerlo es, probablemente, mediante el uso de una hoja de estilo XSLT que le permite contener dos documentos XML y fusionarlos (si recuerdo correctamente, esta es la etiqueta). Necesitará uno para cada archivo xml para asegurarse de que lo hace correctamente, solo piense en la navegación JSF.

Por lo tanto, mi sugerencia es una copia simple de los recursos y un archivo de configuración pr xml de hoja de estilo XSLT hecho a mano.

+0

Es una opción (que limitaría la cantidad de servidores web) pero, en ese caso, aún necesito compartir la sesión y el contexto de seguridad entre guerras. Algunos servidores de aplicaciones permiten compartir la sesión http entre guerras, pero esta no parece ser la función estándar. – Dan

+0

Entiendo que el EAR podría contener varias aplicaciones web no relacionadas, pero ¿no fusionaría dos aplicaciones web en una sola? Pero creo que necesito estudiar más sobre cómo se usan los EAR. ¿Recomienda cualquier proyecto de referencia o EAR para mirar? –

Cuestiones relacionadas