2010-12-30 4 views
44

Maven dependency:analyze si lamenta delle dipendenze nel mio progetto. Come determina quali sono inutilizzati e quali non sono dichiarati? Cosa dovrei fare per loro?Quali sono le dipendenze non utilizzate/non dichiarate in Maven? cosa fare con loro?

Esempio:

$ mvn dependency:analyze 
... 
[WARNING] Used undeclared dependencies found: 
[WARNING] org.slf4j:slf4j-api:jar:1.5.0:provided 
[WARNING] commons-logging:commons-logging:jar:1.1.1:compile 
[WARNING] commons-dbutils:commons-dbutils:jar:1.1-osgi:provided 
[WARNING] org.codehaus.jackson:jackson-core-asl:jar:1.6.1:compile 

... 
[WARNING] Unused declared dependencies found: 
[WARNING] commons-cli:commons-cli:jar:1.0:compile 
[WARNING] org.mortbay.jetty:servlet-api:jar:2.5-20081211:test 
[WARNING] org.apache.httpcomponents:httpclient:jar:4.0-alpha4:compile 
[WARNING] commons-collections:commons-collections:jar:3.2:provided 
[WARNING] javax.mail:mail:jar:1.4:provided 

Nota: Un sacco di queste dipendenze sono utilizzati nel mio container runtime e li ho dichiarato, come previsto per evitare di avere la stessa libreria nel classpath due volte con diverse versioni.

+0

Domanda correlata: http://stackoverflow.com/questions/19382814/. –

risposta

55

Non sono sicuro di come Maven lo determini. Non è necessario indirizzare tutti gli articoli segnalati da questo, ma queste informazioni possono essere utilizzate a seconda dei casi.

Dipendenze non dichiarate usate sono quelle che sono richieste ma che non sono state dichiarate esplicitamente come dipendenze nel progetto. Sono comunque disponibili grazie alla dipendenza transitiva di altre dipendenze nel progetto. È una buona idea dichiarare esplicitamente queste dipendenze. Ciò consente anche di controllare la versione di queste dipendenze (magari facendo corrispondere la versione fornita dal runtime).

Come per dipendenze dichiarate inutilizzate, è una buona idea rimuoverli. Perché aggiungere una dipendenza non necessaria al tuo progetto? Ma poi la transitività può portarli in ogni caso, forse, in conflitto con le tue versioni di runtime. In questo caso, è necessario specificarli, essenzialmente per controllare lo version.

A proposito, mvn dependency:tree fornisce l'albero di dipendenza del progetto, che offre una prospettiva migliore di come ciascuna dipendenza si integri nel progetto.

+4

Inoltre, le dipendenze possono apparire inutilizzate, ma in realtà lo sono. Alcuni esempi di questo sono driver jdbc o jar di configurazione che hanno bisogno di contesti applicativi. – AHungerArtist

+7

Le dipendenze con l'ambito 'runtime' o' provided' verranno contrassegnate come "Non dichiarato dichiarato" a meno che non si utilizzi il flag 'ignoreNonCompile' quando si analizzano le dipendenze. –

+3

Perché è una buona idea dichiarare esplicitamente le dipendenze transitive? Non è l'automatizzazione delle dipendenze transitive come parte di ciò per cui Maven è utile? – slim

2

La risposta a:

"Come determinare quali sono inutilizzati e che sono non dichiarato?".

Maven utilizza il framework Object WebASM che analizza il codice byte non elaborato. Passa attraverso tutte le classi e quindi costruisce un elenco di tutte le classi a cui fanno riferimento. Questo è il modo.

Per quanto riguarda cosa fare, non mi consiglia di rimuovere le "dipendenze inutilizzate e dichiarate" a meno che non siate assolutamente sicuri di non essere effettivamente utilizzate.