2016-07-26 14 views
1

Ich habe zwei Projekte in IntelliJ IDEA 2016 bearbeitet, die Gradle Abhängigkeitsmanagement verwenden: Projekt A und Projekt B.Gradle Abhängigkeitsmanagement - Transitive Abhängigkeit Version Falsche

Projekt A definiert eine Kompilierung Umfang Abhängigkeit für Elasticsearch als:

compile 'org.elasticsearch:elasticsearch:2.3.1' 

Projekt B deklariert eine Kompilierung Rahmen Abhängigkeit für Projekt A, wie so:

compile 'com.mycompany:elasticsearch-common:2.3.1' 

ich würde erwarten, im Gradle Werkzeugfenster in Intelli J IDEA 2016 für Projekt B zu sehen:

... 
com.mycompany:elasticsearch-common:2.3.1 (Compile) 
    org.elasticsearch:elasticsearch:2.3.1 (Compile) 
... 

Stattdessen sehe ich:

... 
com.mycompany:elasticsearch-common:2.3.1 (Compile) 
    org.elasticsearch:elasticsearch:1.5.2 (Compile) 
... 

Keine andere Abhängigkeit in Projekt B hängt von Elasticsearch, so ist es nicht von einer anderen Abhängigkeitserklärung außer Kraft gesetzt werden.

Tatsächlich hat die pom.xml auf unserem Nexus für Projekt A folgt aus:

<dependency> 
    <groupId>org.elasticsearch</groupId> 
    <artifactId>elasticsearch</artifactId> 
    <version>2.3.1</version> 
    <scope>compile</scope> 
</dependency> 

Warum ist IntelliJ die transitive Version für Elasticsearch als 1.5.2 Berichterstattung zu sein?

Was ich versucht habe:

  1. Löschen .idea und .gradle innerhalb Projekt B Verzeichnis
  2. gradle Caches löschen
  3. Caches Invalidierung und Neustart in IntelliJ
  4. Fluchend
  5. Trinken Sie viel von Tee
  6. Freunde und Kollegen fragen
  7. Emailing Oprah
  8. zu IntelliJ Zurückkehren 15, wenn dies alles in Ordnung war (jetzt nicht mehr ist)
  9. auf die Toilette gehen (bezogen auf 5) und gehofft, dass es sich auf magische Weise fixiert, wenn ich zurück

erhalten Keine der oben genannten Arbeiten.

Was bedeutet Arbeit die elasticsearch:2.3.1 Abhängigkeit speziell in Projekt B angeben, aber das negiert nicht den gesamten Grund für transitive Abhängigkeiten?

Jede Hilfe wird geschätzt.

Update 1
Wie in den Kommentaren von LanceJava vorgeschlagen, lief ich gradle dependencies, um zu sehen, was los war.Diese

zeigt, dass es speziell es Herabstufung:

org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2 

Als ich gradle dependencyInsight auf dieser Abhängigkeit lief es kam mit:

:dependencyInsight 
com.mycompany:elasticsearch-common:2.3.1 (selected by rule) 
\--- compile 

org.elasticsearch:elasticsearch:1.5.2 (selected by rule) 

org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2 
\--- com.mycompany:elasticsearch-common:2.3.1 
    \--- compile 

Wer irgendwelche Ideen, warum dies geschieht?

Update 2
Dies scheint die Antwort zu haben: https://discuss.gradle.org/t/excluded-dependence-comes-back-when-spring-boot-plugin-is-applied/17945/2

Es scheint, dass die gradle Feder-Boot-Plugin mag ein wenig zu übernehmen und durchsetzen sie eigene Abhängigkeit Versionen ist (obwohl ich bin nicht Verwenden eines Spring-Boot-Starters, der Federdaten verwendet.

Ich reparierte diese durch Zugabe:

ext[elasticsearch.version] = '2.3.1' 

meiner build.gradle Datei.

+1

Versuchen Sie 'grdle Abhängigkeiten' von der Befehlszeile. Es sollte dir sagen, was vor sich geht. Vielleicht gibt es eine benutzerdefinierte [ResolutionStrategy] (https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html) –

+0

@ LanceJava Danke!Ich tat dies und es sieht so aus, als würde es es speziell herunterstufen: org.elasticsearch: elasticesearch: 2.3.1 -> 1.5.2 Wenn ich dependencyInsight gemacht habe, kam es auf: org.elasticsearch: elasticsearch: 1.5.2 (ausgewählt per Regel) org.elastischeSuche: elasticsearch: 2.3.1 -> 1.5.2 \ --- com.meineUnternehmen: elasticsearch-common: 2.3.1 \ --- Laufzeit – ndtreviv

+0

@LanceJava Siehe das Update. – ndtreviv

Antwort

2

Was in der Frage nicht gemacht wurde klar war, dass dieses Projekt wurde mit den spring-bootgradle plugin, den bestimmten Versionen von Bibliotheken erzwingt, und wurde zwang Herabstufung meiner elasicsearch Version es in Schach zu halten mit er federDatenAnforderungen ist (obwohl ich in meinem Projekt keine Federdaten verwendet habe).

Ich entdeckte diese durch die Ausführung:

gradle dependencyInsight --dependency elasticsearch --configuration compile 

die zu der Zeit kam als:

org.elasticsearch:elasticsearch:1.5.2 (selected by rule) 

org.elasticsearch:elasticsearch:2.3.1 -> 1.5.2 
    \--- com.mycompany:elasticsearch-common:2.3.1 
     \--- runtime 

ich gelernt, dass die (selected by rule) Teil bedeutete, dass etwas programmatisch wurde diese bestimmte Version auswählen. Das hat es zu einem Plugin gemacht.

Ich war nur 4 Plugins, wobei:

  1. java
  2. Maven
  3. Idee
  4. Feder-boot

und das einzige Plugin ich nicht an anderer Stelle benutzt hatte, (und deshalb dieses Problem nicht anderswo erlitten hatte) war spring-boot.

Sobald ich dieses Plugin auskommentiert habe, konnte ich sehen, dass die Abhängigkeit korrekt war.

An dieser Stelle habe ich gelernt, dass ich explizit die Version angeben musste ich nutzen wollte:

ext[elasticsearch.version] = '2.3.1' 

sortiert. Mehr Tee für mich!