2014-04-24 14 views
8

Ho un progetto con una dipendenza da costruttore HTTP, questo mi dà l'albero followoing dipendenze:Perché Maven scegliere la versione 1.0.b2 oltre 1.3.03

[INFO] +- org.codehaus.groovy.modules.http-builder:http-builder:jar:0.5.1:compile 
[INFO] | +- org.apache.httpcomponents:httpclient:jar:4.3.2:compile 
[INFO] | | \- commons-codec:commons-codec:jar:1.6:compile 
[INFO] | +- net.sf.json-lib:json-lib:jar:jdk15:2.3:compile 
[INFO] | | +- commons-beanutils:commons-beanutils:jar:1.8.0:compile 
[INFO] | | +- commons-collections:commons-collections:jar:3.2.1:compile 
[INFO] | | +- commons-lang:commons-lang:jar:2.4:compile 
[INFO] | | \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile 
[INFO] | +- net.sourceforge.nekohtml:nekohtml:jar:1.9.9:compile 
[INFO] | | \- xerces:xercesImpl:jar:2.8.1:compile 
[INFO] | |  \- xml-apis:xml-apis:jar:1.3.03:compile 
[INFO] | \- xml-resolver:xml-resolver:jar:1.2:compile 

Dopo aggiungo hibernate-EntityManager, la versione di xml-apis:aml-apis modifiche. Improvvisamente Maven preferisce utilizzare la versione 1.0b2, che è una dipendenza transitiva via dom4j:

[INFO] +- org.hibernate:hibernate-entitymanager:jar:4.3.1.Final:compile 
[INFO] | +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile 
[INFO] | +- org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile 
[INFO] | +- org.hibernate:hibernate-core:jar:4.3.1.Final:compile 
[INFO] | | +- antlr:antlr:jar:2.7.7:compile 
[INFO] | | \- org.jboss:jandex:jar:1.1.0.Final:compile 
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile 
[INFO] | | \- xml-apis:xml-apis:jar:1.0.b2:compile 

A causa di questo, io ora ottenere la seguente eccezione durante il runtime:

java.lang.IncompatibleClassChangeError: 
Class org.apache.xerces.parsers.AbstractSAXParser$LocatorProxy 
does not implement the requested interface org.xml.sax.Locator 

so che posso risolvere il problema da aggiungere manualmente la dipendenza con il buon numero di versione nel mio pom.xml, ma mi chiedo il motivo per cui è necessaria questa:

<dependency> 
     <groupId>xml-apis</groupId> 
     <artifactId>xml-apis</artifactId> 
     <version>1.3.03</version> 
    </dependency> 

risposta

9

Per impostazione predefinita, quando la stessa dipendenza si trova nella dipendenza albero, Maven usa il più vicino alla radice.

Nel tuo caso, ciò significa

org.hibernate:hibernate-entitymanager:jar:4.3.1.Final:compile 
    \- dom4j:dom4j:jar:1.6.1:compile 
     \- xml-apis:xml-apis:jar:1.0.b2:compile 

Vs

org.codehaus.groovy.modules.http-builder:http-builder:jar:0.5.1:compile 
    \- net.sourceforge.nekohtml:nekohtml:jar:1.9.9:compile 
     \- xerces:xercesImpl:jar:2.8.1:compile 
      \- xml-apis:xml-apis:jar:1.3.03:compile 

O, per dirla in altro modo 3 livelli di profondità vs 4 livelli di profondità così 1.0.b2 vittorie.

Per risolvere questo problema, sia esclude xml-apis dalla dipendenza hibernate-entitymanager o esplicitamente dichiarare una dipendenza xml-apis (anche se potrebbe essere necessario giocare con questo un po ', Xerces e le sue dipendenze può essere un incubo per ottenere allineato versione-saggio) .

+0

In effetti, questo è esplicitamente menzionato nei documenti che ho notato ora: http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html –

+1

'xml-apis' è sempre un soglia del dolore. L'ultima versione di Java in cui era effettivamente richiesto era 1.4 (poiché Java 5 le classi rilevanti sono state nella libreria di classi JRE per impostazione predefinita) ma così tante cose diverse dipendono da esso in così tante versioni in conflitto. Vorrei che ci fosse un modo per specificare un'esclusione globale - "ignorare tutte le dipendenze su xml-apis indipendentemente da dove venissero". –

+1

xml-apis non è l'unico punto di dolore rilevante qui ... xercesImpl è famigerato. Scappa via se puoi. – eis

1

è necessario perché Maven non può sapere quale versione si dovrebbe scegliere, in modo ma ven usa la strategia di vincita più vicina per scegliere quale usare. La strategia di vincita più vicina è documented in Maven documentation.

Nella dipendenza tee hai fornito la versione 1.0.b2 è chiaramente il più vicino, quindi il comportamento funziona come progettato.

Si potrebbe desiderare di guardare this thread in cui questo è stato discusso in precedenza (non ho potuto decidere se quel filo è un duplicato di questo o no)