2011-01-27 9 views
18

Ho un caso in cui voglio una dipendenza dal percorso di classe di runtime ma non il classpath di prova. La dipendenza in questione è Logback, un'implementazione SLF4J. In runtime, desidero che il mio codice (facoltativamente) dipenda dal logback in modo che disponga di un'infrastruttura di logging disponibile. Al momento del test, tuttavia, desidero utilizzare l'implementazione slf4j-nop per nascondere l'output del registro. Con logback come dipendenza di runtime e slf4j-nop come dipendenza di test, durante l'esecuzione dei test viene visualizzato un avviso di implementazione multiplo da SLF4J. Non vedo un modo per escludere logback dal classpath di prova.Come posso avere una dipendenza Maven dal percorso di classe di runtime ma non dal percorso di classe di test?

Non voglio dividere i miei test in un pacchetto separato se può essere evitato.

Idee?

risposta

18

Ho finalmente trovato una soluzione reale a questo. Dalla versione 2.6 del plugin Maven Surefire, esiste ora un elemento di configurazione classpathDependencyExcludes che consente di escludere specifiche dipendenze dal classpath. Funziona così:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.8</version> 
    <configuration> 
    <classpathDependencyExcludes> 
     <classpathDependencyExclude>ch.qos.logback:logback-classic</classpathDependencyExclude> 
    </classpathDependencyExcludes> 
    </configuration> 
</plugin> 
+0

Grazie! Mi hai risparmiato un sacco di tempo nella ricerca con questa risposta. –

+1

Grazie mille. Triste sembra un hack ... Vorrei poter ottenere un "!" operatore nel campo di applicazione. –

0

Funzionerebbe per aggiungere un'esclusione di dipendenza sul logback dalla dipendenza slf4j-nop testata? Qualcosa di simile

<dependency> 
    <groupId>foo</groupId> 
    <artifactId>slf4j-nop</artifactId> 
    <version>1.0</version> 
    <scope>test</scope> 
    <exclusions> 
    <exclusion> 
     <groupId>foo</groupId> 
     <artifactId>logback</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
+0

Ho provato questo, ma "escludi" esclude solo le dipendenze transitive del pacchetto in questione; sfortunatamente, sembra che non possa essere usato per escludere dipendenze arbitrarie propagate da altri classpath. –

2

Se la disattivazione uscita di registro è ciò che si desidera, aggiungere un file di configurazione logback a src/test/resources che scarta tutti gli output.

Se è necessario eseguire questa operazione per più moduli nello stesso reattore, considerare l'utilizzo di maven remote resources plugin.

Questo plug-in viene utilizzato per recuperare i JAR di risorse da repository remoti, elabora tali risorse e le incorpora in JAR creati con Maven. Un caso d'uso molto comune è la necessità di impacchettare determinate risorse in modo coerente all'interno della vostra organizzazione.

+0

Potrei dover andare con questo; sfortunatamente, richiederebbe anche un'ulteriore ristrutturazione del progetto (è un progetto multi-modulo, quindi devo assicurarmi che il file di configurazione sia disponibile in tutti). –

+0

@ Michael: vedere il mio aggiornamento –

1

Per quanto ne so non è necessario escluderlo dal classpath di test. Maven dovrebbe mantenere l'ordine delle dipendenze nel classpath. Se si inserisce la dipendenza di test prima della dipendenza di runtime nelle dipendenze, dovrebbe essere anche prima nel classpath e ClassLoader dovrebbe trovare le classi nella dipendenza di test prima quando 2 dipendenze contengono le stesse classi. Quindi slf4j troverà quindi il binding statico di slf4j-nop e non il binding di logback.

+0

Sì, tuttavia, SLF4J stampa un avviso su più percorsi di classe. Sto cercando di evitare l'avvertimento. –

Problemi correlati