2012-01-22 10 views
7

Quindi ho un'applicazione web in mvc di primavera che ho creato in IntelliJ 9, usando Maven.Come impacchettare le mie classi in un file .jar e ancora come una guerra?

Quando eseguo un:

mvn clean install 

E 'pacchetti tutto in un file sia .war e una guerra esplosa.

Il layout del mio progetto utilizza un tipo di arco di un'app Web semplice e semplice.

How can I have my classes compiled into a .jar file also? 

Attualmente le mie classi sono in:

/target/myapp/WEB-INF/classes/ 

Quello che voglio è per esso per compilare il mio codice in .jar come:

myapp-1.0.jar 

E che avere questo nella mia cartella /target/myapp/WEB-INF/lib come tutti i miei altri barattoli.

Aggiornamento

voglio che questo fatto tramite Maven, non IntelliJ specifica.

+0

Quindi qual è il problema di avere le classi del progetto in WEB-INF/classes come jar in WEB-INF/lib? – khmarbaise

+0

Per uno, alcuni (test) ingegneri dimenticano spesso di aggiornare le classi quando gli si dice di aggiornare la loro webapp installata con il nuovo codice (quindi mantenendo la configurazione). È più semplice avere tutto il codice nella directory lib. – AndrewBourgeois

+0

@Blankman Ho letto le tue domande su SO riguardo l'offuscamento dell'applicazione web. Puoi fornire il processo che hai seguito o alcuni file di configurazione? Sono in grado di generare un vaso offuscato e una guerra (senza offuscare). Ma voglio generare una guerra con obf. barattolo dentro – phoenix

risposta

2

È possibile creare facilmente due artefatti: un JAR e un WAR.

Non sono sicuro quale sia il vantaggio di avere i file .class in un JAR anziché in WEB-INF/classi. Entrambi sono compressi; il JAR non fornirà una compressione extra. Potresti voler riutilizzare quei file .class in altre applicazioni. In questo caso, potresti prendere in considerazione lo spostamento di quelle classi Java in un modulo separato e l'aggiunta del file JAR che crei esattamente come faresti con qualsiasi altro JAR di terze parti nel tuo file WAR. Altre applicazioni potrebbero facilmente essere in grado di estrarre il file JAR dal repository e semplicemente riutilizzarlo. Questa soluzione è meglio spostando le classi Java condivise in un repository separato nel sistema di controllo della versione.

+1

lo sto facendo perché l'esecuzione di proguard lo richiede apparentemente. – Blankman

+0

Bene, voglio farlo usando Maven, quindi posso creare w/o intellij. – Blankman

+0

Come diceva Duffymo, la creazione di due artefatti Maven è la strada da percorrere: un artefatto di vaso, contenente le classi e un artefatto di guerra, con una dipendenza dall'artefatto del vaso. Nota che le dipendenze delle tue classi devono essere spostate dal pom.xml del progetto di guerra al progetto jar. –

-2

Il tipo di confezione è specificato dal tag "packaging" in pom.xml (di solito collocato abbastanza sulla parte superiore del file, insieme con l'artefatto id, la versione ecc del progetto.

cercare di individuare

<packaging>war</packaging> 

nel pom.xml e modificarlo in

<packaging>jar</packaging> 
-2

ok scrivere un comando java nella console

0.123.

jar cvf myapp-1.0.jar * .class

+1

Hai sentito parlare di Maven? Leggi attentamente la domanda! – panagdu

0

Non mi è del tutto chiaro quale beneficio ci possa essere per avere un contenuto di WAR confezionato come JAR. Il codice che implementa la webapp non funzionerà senza il contesto in cui viene distribuita una WAR.

Detto questo, è del tutto pratico pensare in termini di estrazione del nucleo funzionale del codice in un modulo Maven separato con packaging JAR e una buona API Java. Quindi il tuo modulo WAR può essere fatto per dipendere da questo, e deve solo contenere esattamente il codice per trasformare tale API Java in un'API basata sul web.Questo ha il vantaggio che migliorerà notevolmente anche la capacità del tuo codice di essere testato (testare il JAR sarà sicuramente più facile) e ti permetterà di pensare in termini di avere altri client dello stesso codice sottostante. Questo potrebbe o non potrebbe interessarti. Avresti bisogno di qualsiasi codice Java direttamente in WAR? Forse sì forse no. Ci sono diversi modi per farlo, dopo tutto ...

+0

Creare un JAR e un WAR dal modulo _same_ Maven è solo una cattiva idea. Non farlo Pensa una separazione più chiara delle responsabilità. –

0

La soluzione più semplice è nella configurazione per la guerra-plugin:

<attachClasses>true</attachClasses> 

, che farà il lavoro e creare un file jar separati. Questo jar ha un classificatore "classes" che può essere modificato dando alla configurazione. Questo può essere utile se si hanno test di integrazione separati che si basano su classi del progetto di guerra per pubblicarli e renderli disponibili come dipendenze. Questo non ha nulla a che fare con la separazione delle responsabilità.

+0

Se vuoi veramente avere un jar separato e creare un file war separato che contiene il jar (WEB-INF/lib) devi fare progetti separati uno con il jar e uno con il war code che ha una dipendenza dal jar . – khmarbaise

0

Runninng

mvn jar:jar install 

farà vaso come se è stato impostato il tipo di imballaggio per vaso. Senza alcuna modifica al tuo pom.

Quindi tutto ciò che serve è eseguire questa linea separatamente, aggiungerla allo script o aggiungere l'obiettivo jar:jar alla generazione di maven esistente.

Problemi correlati