2015-02-04 4 views
12

Maven è transitivamente tirando in versione a 16 di guava, anche se ho un > sezione < dependencyManagement che specifica versione 18.versione Maven dependencyManagement ignorato in dipendenze transitive

La sintesi rapida:

  • gwizard-example dipende su gwizard-config
  • gwizard-config ha un pom genitore, gwizard-parent
  • gwizard-parent ha <dependencyManagement> che specifica la versione 18 di guava

fortuna questo è un progetto opensource, in modo da poter vedere i pon direttamente: gwizard-parent, gwizard-config, gwizard-example. Tuttavia, qui è il bit importante gwizard-parent:

<properties> 
    <guava.version>18.0</guava.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>${guava.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

... e la dipendenza senza fronzoli dichiarata nel gwizard-example:

<properties> 
    <gwizard.version>0.5</gwizard.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.gwizard</groupId> 
     <artifactId>gwizard-config</artifactId> 
     <version>${gwizard.version}</version> 
    </dependency> 
</dependencies> 

L'albero di dipendenza per gwizard-config mostra guava 18 correttamente:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-config --- 
[INFO] org.gwizard:gwizard-config:jar:0.5 
[INFO] +- com.google.inject:guice:jar:4.0-beta5:compile 
[INFO] | \- com.google.guava:guava:jar:18.0:compile 

Tuttavia, l'albero dipendenza per gwizard-esempio mostra guava 16 (che causa problemi):

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-example --- 
[INFO] org.gwizard:gwizard-example:jar:1.0-SNAPSHOT 
[INFO] +- org.gwizard:gwizard-config:jar:0.5:compile 
[INFO] | +- com.google.inject:guice:jar:4.0-beta5:compile 
[INFO] | | \- com.google.guava:guava:jar:16.0.1:compile 

Questo utilizza Maven v3.2.5. Sono sconcertato. Aiuto?

Possibilmente corrispondenti dependencyManagement in parent ignored

AGGIORNAMENTO: I poms collegati su github cambiano; aggiungendo una dipendenza a gwizard-services (che dichiara direttamente un dep di guava) in gwizard-example "risolto" il problema. C'è ancora una sorta di cattivo comportamento sottostante qui.

UPDATE: Creato this JIRA issue

risposta

4

C'è una cosa semplice. Un dependencyManagement non dichiara una dipendenza che è realmente utilizzata, è solo la definizione di versioni ecc. Che è possibile utilizzare .

Se si definisce qualcosa come questo, non si verificherà alcuna modifica.

<properties> 
    <guava.version>18.0</guava.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>${guava.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Se vi piace veramente sovrascrivere la versione che viene utilizzato in te albero è necessario definire una vera e propria dipendenza: Quindi, sulla base della definizione di cui sopra è necessario aggiungere il seguente così:

<dependencies> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
    </dependency> 
</dependencies> 

Se è stato aggiunto, controllare in seguito tramite mvn dependency:tree.

+4

Questo non ha senso; o almeno, non sembra molto utile. Il punto di 'dependencyManagement' è di permettermi di specificare una versione per le dipendenze transitive. Qui, la guava viene tirata in transito via guiz. Perché il mio 'dependencyManagement 'non controlla la versione tirata da guizza? Perché dovrei specificare guava come dipendenza se la mia libreria non dipende direttamente da guava? – stickfigure

+1

La semplice risposta a questo è, perché il manutentore del pom of guice ha deciso di usare un'altra versione. Quindi non puoi controllare direttamente il pom che viene usato lì. Puoi controllarlo solo indirettamente. BTW: 'dependencyManagement' non controlla. 'dependencies' invece fa sì che sia più vicino al tuo progetto. – khmarbaise

0

Maven non risolve il problema delle dipendenze transitive della versione in questo caso.

Questo problema può essere utilizzato utilizzando il concetto di maven bom.

Controllare la documentazione Maven per bom nel link qui sotto http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

Ecco un altro blog che spiega l'utilizzo di di bom http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/

Nel tuo caso per risolvere questo problema, è necessario aggiungere la dipendenza di seguito nella sezione dependencyManagement del progetto gwizard-example.

 <dependency> 
     <groupId>org.gwizard</groupId> 
     <artifactId>gwizard-parent</artifactId> 
     <version>${gwizard.version}</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
+1

Questo non ha senso; o almeno, non sembra molto utile. Il punto di dipendenzaGestione è _allow_me_to_specify_a_version_ per le dipendenze transitive, non eredita la versione di un altro progetto ... – Galigator