2012-10-23 8 views
9

Ho un progetto X che mostra un bel po 'di dipendenze in conflitto nella gerarchia delle dipendenze (come mostrato nella vista della gerarchia delle dipendenze di Eclipse). Vedo un sacco di cose come:Le dipendenze transitive in conflitto sono un problema serio in Maven?

clojure: 1.3.0 (omitted for conflict with 1.4.0) [compile] 

Questo di solito si verifica a causa di due delle librerie usate da X specificare due diverse versioni di qualche altra biblioteca - vale a dire i conflitti si verificano a causa delle dipendenze transitive condivisi. In alcuni casi i conflitti sono in librerie di terze parti che non posso controllare direttamente.

Fortunatamente tutto ora funziona e funziona bene, ma sono preoccupato se questa situazione potrebbe causare problemi in futuro.

È un problema di cui dovrei preoccuparmi e, in caso affermativo, cosa dovrei fare al riguardo?

+1

Fin dalla mia "xml e xml parser adventure" provo a mitigare questi problemi, ad es. almeno PROVATE. Una libreria che dipende da una e una versione di un'altra, che viene quindi omessa perché un'altra libreria ha bisogno di una versione più recente della stessa libreria che sembra un calcio ben eseguito nelle palle. Di solito cerco di gestire le versioni di librerie di terze parti in conflitto ... anche se devo ammettere che non sempre funziona. O funziona bene. – Scorpio

risposta

4

Sì, tali conflitti possono essere seri.

Non si sa se c'è una modifica incompatibile in una dipendenza quando si confrontano le versioni una con l'altra (Non ci dovrebbe essere quando si confrontano versioni minori, ma chi lo sa esattamente?). O forse una dipendenza dipende da un comportamento bacato di un'altra dipendenza. Cosa succede se questo bug è stato risolto? Quello un modulo che dipende dal bug non funzionerà correttamente.

È necessario escludere dipendenze in conflitto (molto probabilmente escludendo versioni inferiori). Per ogni esclusione inserita, è necessario verificare se sono presenti modifiche incompatibili tra la versione esclusa e la versione attualmente in uso. In tal caso, è necessario verificare le dipendenze che dipendono da quel modulo, se sono interessate da tali modifiche.

3

La maggior parte delle volte questo dovrebbe essere ok, se la versione più recente è stata selezionata da Maven.

Si dovrebbe iniziare a preoccuparsi se i conflitti si verificano con differenze nella versione principale (il primo numero) o se la versione più recente è stata omessa. Le unitstests aiutano molto a cogliere questi problemi, ma spesso il progetto eclipse e le dipendenze dei maven differiscono in modo sottile (debug-scope, ecc.). L'unica vera protezione sembra essere test di integrazione.

2

È possibile essere un problema serio come non si può mai essere sicuri esattamente cosa succede, e questo è male. Penso che il punto principale dell'utilizzo della configurazione di Maven sia esplicito su cosa succede e quali sono le dipendenze utilizzate.

Per quanto riguarda ciò che si dovrebbe fare a questo proposito, vedere la mia other answer - si dovrebbe spingere verso alla fissazione 'em esplicitamente configurando quale versione usare e quali lasciare fuori, e maven-enforcer plugin può rendere molto più facile con DependencyConvergence rule. È lì per proteggerti dalle dipendenze transitive in conflitto.

Problemi correlati