Come escludere una dipendenza scavata dal test Maven da Eclipse (ma tenerla nel percorso per i test unitari)

StackOverflow https://stackoverflow.com/questions/9426957

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:

dependency listed on build path

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top