2015-02-04 1 views
12

Maven transitively in Version ziehen 16 von Guave, obwohl ich habe einen <dependencyManagement> Abschnitt die Version 18.Maven dependencyManagement Versionsabhängigkeiten in transitiv ignoriert

Die kurze Zusammenfassung gibt:

  • gwizard-example hängt auf gwizard-config
  • gwizard-config hat einen Elternteil pom, gwizard-parent
  • gwizard-parent hat <dependencyManagement> die
  • Version 18 von Guave gibt

Zum Glück ist dies ein Open-Source-Projekt, so dass Sie die Poms direkt sehen können: gwizard-parent, gwizard-config, gwizard-example. Allerdings ist hier das wichtige Bit in 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> 

... und die No-Frills-Abhängigkeit in gwizard-Beispiel erklärt:

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

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

Der Abhängigkeitsbaum für gwizard-config zeigt Guave 18 richtig:

[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 

jedoch der Abhängigkeitsbaum für gwizard-Beispiel zeigt, Guave 16 (was Probleme verursacht):

[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 

Dies ist mit Maven v3.2.5. Ich bin verwirrt. Hilfe?

Möglicherweise verwandte: dependencyManagement in parent ignored

UPDATE: Die poms auf GitHub verbunden verändern; Hinzufügen einer Abhängigkeit zu gwizard-services (die direkt eine Guave dep erklärt) in gwizard-example "behoben" das Problem. Es gibt immer noch eine Art schlechtes zugrunde liegendes Verhalten.

UPDATE: this JIRA issue

Antwort

4

Es Erstellt ist eine einfache Sache. A dependencyManagement deklariert keine Abhängigkeit, die wirklich verwendet ist es nur definieren Versionen usw. die kann verwendet werden.

Wenn Sie so etwas definieren, führt dies nicht zu einer Änderung.

<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> 

Wenn Sie wirklich die Version gerne zu überschreiben, die in Ihnen Baum verwendet wird, müssen Sie eine echte Abhängigkeit definieren:

<dependencies> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
    </dependency> 
</dependencies> 
: folgendes hinzuzufügen und so basiert Sie auf der obigen Definition benötigen

Wenn Sie dies hinzugefügt haben, überprüfen Sie bitte danach über mvn dependency:tree.

+4

Dies macht keinen Sinn; oder zumindest scheint es nicht sehr nützlich zu sein. Der Punkt von 'dependencyManagement' ist, dass ich eine Version für transitive Abhängigkeiten angeben kann. Hier wird Guave über Guice transitiv eingezogen. Warum kontrolliert meine 'dependencyManagement' nicht die von guice gezogene Version? Warum sollte ich Guava als Abhängigkeit angeben, wenn meine Bibliothek nicht direkt von Guava abhängig ist? – stickfigure

+1

Die einfache Antwort darauf ist, weil der Betreuer des Pom von Guice sich dafür entschieden hat, eine andere Version zu verwenden. Sie können also das dort verwendete Pom nicht direkt steuern. Sie können es nur indirekt steuern. BTW: 'dependencyManagement' kontrolliert nicht. 'Abhängigkeiten' statt dessen, weil es näher an Ihrem Projekt ist. – khmarbaise

0

Maven löst das transitive Abhängigkeitsproblem in diesem Fall nicht.

Dieses Problem kann durch Verwendung von Maven bom Konzept verwendet werden.

die Maven-Dokumentation prüfen bom in dem unten stehenden Link http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

Hier ist ein weiterer Blog ist, die die Nutzung von bom http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/

In Ihrem Fall erklärt, dieses Problem zu lösen, müssen Sie die unten Abhängigkeit hinzufügen im Abschnitt dependencyManagement des Projekts gwizard-example.

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

Das macht keinen Sinn; oder zumindest scheint es nicht sehr nützlich zu sein. Der Punkt von dependencyManagement ist _allow_me_to_specify_a_version_ für transitive Abhängigkeiten, erbt nicht die Version eines anderen Projekts ... – Galigator