2009-10-07 6 views
10

Nella nostra azienda, abbiamo un numero di moduli diversi costruiti come guerre separate. Ogni cliente può scegliere il modulo che desidera acquistare. Poiché tutti i moduli condividono la stessa sessione, il contesto di sicurezza ecc., Ha senso fonderli in una singola guerra.Come unire le guerre in una?

È possibile automatizzare questo processo? Ad esempio, dovrebbe unire web.xml, calcolare ogni dipendenza da wars, copiare file come .jsp e .class ecc. A proposito, stiamo usando Maven, ma non siamo stati in grado di trovare una soluzione a questo problema.

risposta

7

attribuiti i rischi menzionati da djna e ChssPly76, si può essere in grado di ottenere ciò utilizzando le sovrapposizioni con lo Maven WAR plugin. Ciò richiederà di separare i mapping servlet per assicurarsi che non vi siano collisioni tra URL e simili, ma potrebbe fare il trucco.

Fondamentalmente, si crea un modulo con più dipendenze WAR e si utilizza il plugin per unirle in un nuovo.

+0

Che funziona per quasi tutti i file (non-clashin g) provenienti dalle diverse guerre del webapp. Conosci un modo per unire i diversi file web.xml? –

1

È chiaramente possibile farlo, ma penso che sarebbe meglio lavorare su una singola WAR, in primo luogo. Il ritardo del "pick-and-mix" dei contenuti di WAR è un incubo di supporto per me.

+1

Se il client non acquista il modulo, quindi non voglio distribuire il modulo al client (e ricorrere a nasconderlo ..). Inoltre, tale guerra sarebbe enorme - sarebbe molto poco pratico per scopi di sviluppo, ecc. – Dan

0

In generale, no, non è possibile. Cosa succede se hai nomi JSP duplicati? Nomi/mappature servlet? Stessi ascoltatori di contesto che caricano con parametri diversi (comuni se usi Spring/Struts/etc ...)? Ottieni il punto.

Nel vostro caso particolare può essere o non essere possibile a seconda delle circostanze specifiche. Estrarre la guerra e copiare JSP/classi/librerie è facile; l'unione di web.xml è un po 'più complessa in quanto è necessario mantenere l'ordine degli elementi: potrebbe essere più semplice definire manualmente un web.xml "unito".

+0

Sarei felice di avere lo strumento che abortisce se uno di questi conflitti viene scoperto. – Dan

+0

Penso che una politica possa gestire quegli scontri diretti di nomi (le sovrapposizioni usano una politica di "prime vittorie", anche se una "guerra tra cui la sottoguerra vince" avrebbe più senso per me. Voglio farlo e unire web- xmls e dispongono di servlet e filtri di sub-war mappati e disponibili nel risultato.Se esiste un conflitto tra il nome del servlet o il percorso di mappatura servlet, è necessario un criterio per risolvere i conflitti come menzionato sopra. Molto utile quando si ha una piattaforma di base che si desidera combinare in diversi progetti/prodotti finali –

-1

Potrebbe essere possibile ottenere qualcosa che funzioni con One-Jar.

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

Probabilmente non fa tutto quello che volete.

+0

One-jar non funziona con le guerre. –

4

Ricordo che lo cargo-maven2-plugin ha un mojo uberwar. Non l'ho usato ma capisco che è destinato a fondere guerre, anche se è necessario fare attenzione per evitare conflitti.

Una scansione rapida della sorgente indica che si definisce merge descriptor per determinare come unire le guerre. Sfortunatamente lo documentation site è scomparso quindi non posso darti ulteriori dettagli.

È possibile controllare il sito Codehaus Jira per una comprensione dello stato corrente.

Per usare il plugin che ci si specifica il qualcosa di configurazione come questa:

<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> 

(ancora alla ricerca di un esempio di merge.xml)

+0

@Pascal Tendo ad essere d'accordo, ma se non ci sono opzioni per refactoring, ciò fornisce una soluzione alternativa. –

+0

@Rich Sure, è vero e ho dato il mio +1 Ho rimosso il mio commento precedente in quanto può essere interpretato erroneamente –

+2

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

1

Gli EAR sono progettati per contenere più oggetti. Questa sarebbe una possibilità per te?


Edit: Prima di tutto, lascia supporre che non ci sono le risorse duplicate (che si dovrebbe andare nel vaso finale?) E che tutti i vasi sono compatibili (si dispone di una sola versione di ogni ecc biblioteca) .

Si dovrebbe essere in grado di copiare semplicemente il contenuto di WEB-INF/uno sopra l'altro, ad eccezione dei vari file XML che devono essere attentamente uniti. Il modo più semplice per farlo è probabilmente utilizzando un foglio di stile XSLT che ti consente di conservare due documenti XML e unirli (se ricordo correttamente questo è il tag). ne avrai bisogno uno per ogni file xml per essere certo che lo faccia correttamente, basti pensare alla navigazione JSF.

Quindi, il mio suggerimento è una semplice copia di risorse e un file di configurazione XSLT in fogli di stile pr xml.

+0

È un'opzione (che limiterebbe il numero di server web) ma in quel caso ho ancora bisogno di condividere il contesto di sessione e sicurezza tra le guerre. Alcuni server di app consentono la condivisione della sessione http tra guerre, ma questa non sembra essere la caratteristica standard. – Dan

+0

Capisco che l'EAR sarebbe in grado di contenere più webapps non correlate, ma non unire due app web in una? Ma penso che ho bisogno di studiare di più su come vengono usate le EAR. Raccomanda qualsiasi riferimento o progetto EAR da guardare? –