2010-01-05 1 views
15

Sto aggiornando un progetto esistente da GWT 1.5.2 a GWT 2.0.0. Usiamo Maven 2 per gestire le nostre dipendenze e fare tutto il nostro sviluppo in Eclipse 3.5.Come posso copiare le dipendenze gestite da Maven copiate in war web-inf lib in modo da poter eseguire la mia app GWT 2.0 in modalità di debug all'interno di Eclipse?

Poiché usiamo Maven per gestire le nostre dipendenze, non ho tutti quei vasi nella directory war \ web-inf \ lib come specifica GWT. Invece, sono nel repository di maven, proprio dove piacciono a loro. Ho impostato il progetto in modo che Maven possa creare e avviare correttamente in modalità dev o web e che l'applicazione funzioni correttamente.

Il problema è che quando lancio da Eclipse, ottengo un java.lang.NoClassDefFoundError. Se copio manualmente le mie dipendenze in war \ web-inf \ lib prima del lancio, tutto funziona correttamente, ma ciò non si presta a una soluzione a lungo termine. Innanzitutto, se controllo tutti questi vasi nel nostro controllo di versione, questo sovvertirà gran parte del valore che otteniamo da Maven. Per quanto fastidioso possa essere il maven, abbandonarlo non è la risposta. In secondo luogo, avere gli sviluppatori copiarli manualmente ogni volta che vogliono eseguire il debug di qualcosa è ridicolo.

Quindi posso ottenere Eclipse per copiare le dipendenze in war \ web-inf \ lib prima dell'avvio? C'è una soluzione alternativa che mi manca?

Grazie,

Tony

risposta

11

L'esecuzione dell'obiettivo copierà le dipendenze di tipo Maven in war/WEB-INF/lib. Vedere la sezione Configurazione di Eclipse della documentazione Eclipse IDE Integration dello Maven GWT plugin per ulteriori dettagli. Date un'occhiata allo this answer a proposito di Maven GWT 2.0 ed Eclipse.

1

Se avete il metodo di confezionamento nella vostra pom.xml impostato per la guerra dovrebbe copiare depdencies runtime in target/guerra/WEB-INF/lib.

Oppure il tuo progetto è di costruire qualcosa di più grande come un orecchio? In tal caso dovresti probabilmente dividere il tuo pom.xml in formato multiprogetto.

Per quanto riguarda Eclipse, non ho molta familiarità con esso, quindi non posso davvero aiutarti lì. Sei (o riesci a) eseguire un bersaglio esperto (come "installa") quando esegui un'esecuzione o un debug?

2

È necessario installare m2eclipse plugin e utilizzarlo per creare il progetto in eclissi. Ciò richiamerà Maven come uno strumento esterno dall'interno di eclissi.

Il tipo di artefatto del progetto Maven deve essere impostato su war, che consentirà a Maven di scoprire le dipendenze e raggrupparle.

vedere questi link:

force Maven2 to copy dependencies into target/lib

http://maven.apache.org/plugins/maven-war-plugin/

http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html

+0

Ho aggiunto il plugin m2eclipse ad Eclipse, ma questo sembra aver messo in ginocchio Eclipse. Ora si blocca "Aggiornamento delle dipendenze Maven" all'avvio. Una volta ottenuta una nuova installazione di Eclipse, farò un tentativo. – Tony

+0

Un repository di Maven locale può alleviare il problema di aggiornamento delle dipendenze. Consiglio vivamente di configurare un'istanza di Nexus http://nexus.sonatype.org/ e di impostare le impostazioni di maven per utilizzare mirrorOf = * -> il repository locale nexus. Gli aggiornamenti iniziali richiederanno un po 'di tempo, ma in seguito il resto del tuo team scaricherà risorse locali memorizzate nella cache, con vantaggi per te, il tuo team, i repository Maven pubblici e il resto di Internet. – crowne

+0

Il plugin m2eclipse ti renderà la vita molto più semplice. Trova riferimenti tra progetti e li collega tramite Eclipse in modo da non dover andare alla riga di comando per ricostruire istantanee ogni volta che si modifica un progetto dipendente. Inoltre crea il classpath per te e lo aggiorna con il file pom. L'unico problema che ho riscontrato è che a volte non crea nuove dipendenze, quindi devi eseguire una 'dipendenza mvn: risoluzione' dalla riga di comando quando aggiungi una nuova dipendenza che non si trova nel tuo repository locale. –

0

Questo non dovrebbe essere un problema. Se si utilizza Eclipse + WTP, WTP consente di dichiarare i file elencati sotto 'Dipendenza modulo J2EE' nelle proprietà del progetto. Questi vasi vengono automaticamente pubblicati su tomcat (vedere la nota alla fine di questo commento) È necessario dichiarare una variabile M2_REPO nell'ambiente Eclipse (cercare la guida di eclissi per "variabili del classpath"), dovrebbe puntare al repository locale di Maven e aggiungi semplicemente jar esterni da lì al tuo progetto e contrassegnali come "dipendenze J2EE". ho fatto con tonnellate di progetti, Maven ed Eclipse in diretta side-by-side :) (senza m2eclipse)

Una seconda opzione è quella di cercare di integrare Eclipse e Maven con il plugin m2eclipse, come Crowne menzionato, ma ho trovato questo non è necessario.

C'è una terza opzione, se non si utilizza WTP (ma si dovrebbe). Supponendo che tu usi tomcat, puoi copiare quei vasi su $ (tomcat.home)/common/lib. Se puoi farlo solo per la tua istanza privata di tomcat (su ogni macchina dello sviluppatore), allora sei a posto. Questa dovrebbe essere una soluzione a basso impatto che otterrà quei jar nel classpath in fase di esecuzione, ma non si adatta bene.

nota: sfortunatamente il classpath dei progetti Web di Eclipse può essere fonte di confusione. Quando aggiungi i jar al normale percorso di costruzione del progetto, non vengono distribuiti (copiati) su tomcat. Per risolvere questo problema, WTP definisce una libreria speciale denominata Libreria Webapp: questa libreria contiene tutti i vasi nella cartella WEB-INF/lib del progetto, nonché tutti i vasi esterni contrassegnati come Dipendenze del modulo J2EE. Tutti questi vasi trovano la loro strada in modo appropriato a WEB-INF/lib quando vengono pubblicati su tomcat.

2

un IDE esperto (idea, eclissi, netbeans) dovrebbe fare automaticamente questo imballaggio. forse tu:

  • dimenticato di abilitare l'importazione di maven all'interno di IDE?
  • non ha aggiunto queste dipendenze al pom.xml (quindi non sono incluse nella fase 'pacchetto mvn')
  • aggiunto l'ambito errato alla dichiarazione di dipendenza (es. Ambito 'fornito' o 'testato'), quindi vengono ignorati per il runtime
0

abbastanza semplice: 1. Creare una cartella "lib" sotto il vostro progetto come questo: "\ src \ main \ webapp \ WEB-INF \ lib" 2. Copia bisogno " jar "ecc. che si desidera includere nella cartella del pacchetto WAR. 3. Richiama la tua generazione di maven come fai normalmente. Io uso "mvn install", che crea costruisce il file di guerra.

Se si esamina il file WAR, i propri jar inclusi nel passaggio 1 e nel passaggio 2 saranno presenti.

Cheers.

+0

Questo non è utile.Se leggi il terzo paragrafo della domanda, ti spiego perché il passo 2 della tua risposta non funziona per me. – Tony