2012-05-02 12 views
6

Ho un artefatto di guerra e ho bisogno di usare alcune delle loro classi da un barattolo. Non riesco a spostare le classi per un altro progetto, quindi schiero le classi e risorse inclusi nella mia webapp come un artefatto "attaccato" utilizzando la seguente configurazione:Errore di dipendenza Maven in Eclipse

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
     <attachClasses>true</attachClasses> 
    </configuration> 
</plugin> 

Questo si tradurrà in due manufatti da distribuire: mywebapp-1.0-SNAPSHOT.war e mywebapp-1.0-SNAPSHOT-classes.jar.

di utilizzare tali classi I riferimento al manufatto come segue:

<dependency> 
     <groupId>mygroup</groupId> 
     <artifactId>mywebapp</artifactId> 
     <version>${project.version}</version> 
     <classifier>classes</classifier> 
    </dependency> 

Quando ho compilato da Jenkins tutto funziona correttamente, ma quando ho eseguito i test a livello locale da Eclipse non riesce a trovare le classi di riferimento. (java.lang.NoClassDefFoundError)

Penso che potrebbe essere un bug nel plugin eclissi di Maven, qualcuno ha qualche idea che può accadere?

risposta

4

La mia risposta è semplice: il seguente Link per il sistema di tracciamento bug di Eclipse:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=365419

vedere le risposte al suo interno.

Sì, è un problema con Eclipse stesso ..

La soluzione all'interno di Eclipse è sufficiente aggiungere il progetto manualmente all'interno del vostro spazio di lavoro per il progetto appropriato in cui è necessario le classi dal vostro progetto di guerra.

+0

Oltre alla fastidiosa necessità di intervenire manualmente con l'installazione del progetto, ulteriore svantaggio è che le classi e le risorse dai progetti dipendenti si insinua nei risultati di ricerca, quindi invece di aprire l'origine della classe di riferimento si finisce spesso nella visualizzazione di file disordinati o nella versione disassemblata della tua classe hai perfettamente fonti disponibili :( Nota: le classi entrano nei risultati nonostante siano correttamente contrassegnate come risorse "derivate", mi sembra un bug, verificato su Eclipse Mars SR 1. – Espinosa

5

soluzione alternativa è descritta a http://wiki.eclipse.org/M2E-WTP_FAQ:

Esiste una soluzione alternativa, però, abbiamo bisogno di cambiare la dipendenza se il progetto è costruito in Eclipse o meno. Nel progetto dipendente, è possibile configurare il seguente:

<dependencies> 
... 
<dependency> 
    <groupId>com.company</groupId> 
    <artifactId>mywebapp</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <classifier>${webClassifier}</classifier> 
</dependency> 
... 
</dependencies> 
... 
<properties> 
... 
<webClassifier>classes</webClassifier> 
</properties> 
... 
<profiles> 
<profile> 
    <id>m2e</id> 
    <activation> 
    <property> 
     <name>m2e.version</name> 
    </property> 
    </activation> 
    <properties> 
    <webClassifier></webClassifier> 
    </properties> 
</profile> 
</profiles> 

Il profilo M2E si attiva automaticamente quando il progetto è costruito con M2E, ignorata in altre circostanze. Solo in questo caso, il progetto dipendente utilizzerà un classificatore vuoto per fare riferimento al progetto Web, che verrà aggiunto al classpath come previsto.

+1

Posso confermare che risolve il problema con risoluzione dello spazio di lavoro per dipendenze con classificatore, in genere progetti di guerra con attachClasses = true. Tuttavia, lo svantaggio è che ora le versioni tra riferimento di dipendenza e progetto di riferimento * devono corrispondere perfettamente *, altrimenti viene segnalata come una mancanza di depenimento denza. Nel termine pratico significa molto di più dei checkup git. – Espinosa