Come escludere una dipendenza scavata dal test Maven da Eclipse (ma tenerla nel percorso per i test unitari)
-
12-11-2019 - |
Domanda
Sto riscontrando alcuni problemi a ottenere Eclipse per onorare una dipendenza da maven saltata dal test - si sta presentando sul percorso di costruzione e scherzando con la risoluzione di compilation / Javadoc di Eclipse.
Un esempio con Java EE Libs
Ho usato il javaee-api-6.0
Biblioteca per compilare la mia domanda Java EE contro.
Tuttavia, ai fini del test unitario, volevo avere accesso a qualcosa di più della semplice API: avevo bisogno di un'implementazione. Così ho incluso le libs di pesce vetro incorporato con un ambito di prova come così:
<repositories>
<repository>
<id>glassfish-extras-repository</id>
<url>http://download.java.net/maven/glassfish/org/glassfish/extras</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>compile</scope>
<type>jar</type>
</dependency>
</dependencies>
Funziona come previsto con Maven
Dalla mia comprensione, a causa del <scope>test</scope>
Della dipendenza da Glassfish, non sarà incluso nel normale compile
fase.
Perché entrambe le dipendenze sarebbero incluse nel test-compile
Fase, ero sicuro di posizionare la dipendenza da Glassfish prima della dipendenza Javaee-API in modo che il primo venisse usato in preferenza per il secondo quando compilavano le classi di test. E così, quando si utilizza solo Maven per costruire, questa configurazione non è un problema.
Non funziona come previsto nell'eclissi
Tuttavia, quando si utilizza M2E ed Eclipse, la dipendenza da Glassfish è elencata nel mio percorso di build:
Poiché la dipendenza da Glassfish è elencata prima della dipendenza Java-EE-API, sembra che Eclipse stia usando il Lib errato (pesce vetro, anziché Java-ee-api) per convalidare / compilare / cercare Javadocs. (In realtà, non sono sicuro al 100% che la compilation stia usando la libr errata - dipende dal fatto che sotto l'eclissi del cofano stia usando Maven per eseguire la compilation utilizzata durante la convalida del codice e non so se lo è o no - ma La ricerca Javadoc si riferisce sicuramente alla libica errata)
La domanda
Come posso impedire a Eclipse di usare il pesce vetro, tranne quando si esegue i test dell'unità? Voglio assicurarmi che le mie ricerche di compilation / Javadoc stiano accumulando sull'API, non una particolare attuazione di quell'API.
Soluzione
È passato un po 'di tempo da quando ho pubblicato questa domanda per la prima volta, ma:
Come posso impedire a Eclipse di usare il pesce vetro, tranne quando si esegue i test dell'unità?
Non puoi. Eclipse è legata al concetto di un percorso di build per progetto e M2E/M2E-WTP non può (o non) superare questa limitazione, come descritto nel seguente bug:
L'ambito delle dipendenze non ha alcun effetto sulla compilation di Eclipse
Aggiornamento 08-giugno-2016
Con il rilascio di JEE7, il javaee-api
File Jar ora contiene file di classe utilizzabili reali. Ciò significa che può essere utilizzato nei test e non ho bisogno di specificare il glassfish-embedded-all
File Jar prima nel file POM.
Quindi ora che Eclipse sta tirando la sorgente e Javadoc dal file jar giusto (cioè javaee-api
e non glassfish-embedded-all
) Non mi interessa tanto che il test è stato scoperto glassfish-embedded-all
è ancora sul percorso di classe in Eclipse.
Non è una soluzione alla domanda che ho originariamente proposto, ma è è Una soluzione al problema sottostante che stavo vivendo in quel momento. Forse aiuterà anche qualcun altro.
Altri suggerimenti
Ho anche lottato con questo problema e alla fine ho trovato una soluzione. È stato installato il plug -in M2E ma è necessario anche il connettore M2E WTP, che non è installato per impostazione predefinita. A seconda della versione M2E, ciò viene realizzato in modo diverso. Per l'ultima versione, sotto "Preferenze" -> "Maven" -> "Discovery". Fai clic su "Apri catalogo". Selezionare il connettore M2E - WTP.
Dopo l'installazione, fai clic con il pulsante destro del mouse sul progetto e seleziona "Maven" -> "Aggiorna la configurazione del progetto ..."
Il tuo pom.xml dovrebbe apparire così:
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
Eclipse dovrebbe distribuire felicemente, i test unitari dovrebbero eseguire in Eclipse e anche Maven sulla linea di comando dovrebbe essere piacevole.
Spero che sia di aiuto.
Forse funziona se configuri Surefire-Plugin
- escludere l'API Depodency (che è inclusa come dipendenza da progetto) e
- Includi la dipendenza da glasfish (non includerla per le dipendenze del progetto)
come questo:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<classpathDependencyExcludes>
<classpathDependencyExclude>javax:javaee-api
</classpathDependencyExclude>
</classpathDependencyExcludes>
</configuration>
<dependencies>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Dai un'occhiata al Configurazione del percorso di classe Parte del plug -in Surefire (il plug -in che esegue il sito test).
Dalla documentazione (esterno escludere il nome dell'elemento E escludere il nome dell'elemento interno con 'S')
<classpathDependencyExcludes>
<classpathDependencyExcludes>org.apache.commons:commons-email</classpathDependencyExcludes>
</classpathDependencyExcludes>
Ma suppongo che dovrebbe essere (solo nome elemento esterno con 'S'):
<classpathDependencyExcludes>
<classpathDependencyExclude>org.apache.commons:commons-email</classpathDependencyExclude>
</classpathDependencyExcludes>
Penso dal lato Eclipse se non hai Lib in buildpath non puoi averlo specificamente per unittest o elaborazione delle risorse ecc.
Dalla pratica: prova a organizzare dipendenze in pom.xml e ordine di libs in eclipse buildpath sarà lo stesso nella maggior parte dei casi.