2014-12-31 15 views
13

Qual è il modo migliore per dichiarare una dipendenza Maven come solo utilizzata per il percorso di classe runtime di test (ma non per la compilazione di test)?Dichiarare la dipendenza Maven solo come runtime di prova

In particolare, voglio slf4j-api (una facciata di registrazione) come una tipica, compilare-scope dipendenza, ma voglio slf4j-simple (l'attuazione barebone adatto per unit test) solo sul percorso classe di test runtime (non è necessaria per la compilazione di test). Ho fatto questo:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-simple</artifactId> 
    <scope>test</scope> 
</dependency> 

Tuttavia, il rovescio della medaglia è che i rapporti dependency:analyzeslf4j-simple come non inviata, presumibilmente perché non è necessaria per la compilazione:

[WARNING] Unused declared dependencies found: 
[WARNING] org.slf4j:slf4j-simple:jar:1.7.7:test 

non posso usare un runtime dipendenza perché non voglio che questa dipendenza sia ereditata in modo transitivo (ad es. le dipendenze downstream possono usare log4j, ecc.). Ho provato runtime con optional=true, ma questo ha lo stesso avvertimento.

(Si noti che ho potuto anche impostare ignoreNonCompile per il plugin di dipendenza, ma che sembra uno strumento molto schietto che sarebbe nascondere altri problemi potenziali.)

+0

cosa è richiesto in fase di esecuzione per la fonte principale? non si lamenterà ancora per la dipendenza dell'ambito 'runtime'? –

+0

In generale, le dipendenze transitive non devono essere dichiarate. Per una dipendenza opzionale (tipicamente come la registrazione che può utilizzare diversi framework) la procedura è corretta. Forse puoi anche aggiungere un test di ambito. –

+0

Si lamenta anche (erroneamente, IMHO) per una dipendenza 'runtime', quindi sembra che lo scope da solo non sia la risposta qui. Quello che voglio veramente è un ambito che è l'intersezione di 'test' e' runtime' (per quanto riguarda il percorso di classe) e che il plugin di dipendenza agisca meno stupido sulle dipendenze "inutilizzate" di runtime. –

risposta

7

Non esiste uno scopo che fa esattamente ciò che si desidera qui; test è la migliore opzione disponibile.

È stato richiesto un ambito test-runtime (Re: Need for a test-runtime scope?) e la soluzione suggerita è esattamente la configurazione ignoreNonCompile che hai già scoperto.

dependency:analyze ha già alcune limitazioni ("some cases are not detected (constants, annotations with source-only retention, links in javadoc)"). Potrebbe essere necessario accettare che tutte le dipendenze dallo scenario test con cui viene messo in guardia siano falsi positivi.

potrebbe dividere la definizione dei test in un modulo separato, che non hanno slf4j dipendenze di implementazione, poi eseguito in un altro modulo. Non credo che sarebbe valsa la pena.)

+1

Per il problema con javadoc ho fatto ricorso al collegamento con il nome classe completo e aggiungendo l'URL del collegamento di base al plugin javadoc e non dichiarando una dipendenza dal progetto.Questo evita di avere una dichiarazione di importazione e altri potenziali problemi negativi di avere una dipendenza elencata che non è effettivamente richiesta. –

4

Non esiste il concetto di test-runtime in Maven. L'unico vero svantaggio è l'analisi delle dipendenze che identifica queste dipendenze del test di runtime come non utilizzate. Poiché si tratta solo di dipendenze di test, tuttavia, ciò è abbastanza positivo e non può causare problemi ad altri progetti che dipendono in modo transitorio da questo progetto.

Problemi correlati