2016-07-08 27 views
2

Ich habe ein Projekt abhängig von Netflix Feign und Glassfish Jersey Implementierung.Kann ich Gradle sagen, dass zwei verschiedene Abhängigkeitsmodule tatsächlich gleich sind und es die mit der höchsten Version auswählen?

Feign verwendet die 1.1-Spezifikation von JAX-RS (JSR 311), und Glassfish-Trikot Implementierung verwendet die Spezifikation 2.0. Der 2.0 ist abwärtskompatibel, aber der Name der Gradle-Abhängigkeit wurde geändert.

So habe ich zwei Abhängigkeiten in meinem Projekt:

  • javax.ws.rs:jsr311-api:1.1.1
  • javax.ws.rs:javax-ws-rs-api:2.0
  • .1

beiden implementiert die gleichen Klassen in dengleichen Pakete, aber eine nach 1.x und einer entsprechend 2.x

In meinem Java-Code kann ich nur auf den Klassennamen und das Paket hinweisen.

Kann ich Gradle sagen, dass dies tatsächlich das gleiche Paket ist, obwohl der Name anders ist und auf diese Weise nur einen Satz der implementierenden Klassen im Klassenpfad erhält?

Im Moment ist es zufällig, welche Version der Klassen die JVM und der Compiler auswählen. Manchmal kompiliert es nicht, manchmal kompiliert es aber nicht (MethodNotFoundException).

+1

Ich glaube nicht, dass das möglich ist, aber Sie können die alte Abhängigkeit explizit ausschließen. –

Antwort

1

Am Ende, habe ich diese auf meine gradle Datei und es sieht gut:

configurations.all { 
    resolutionStrategy.dependencySubstitution { 
     substitute module('javax.ws.rs:jsr311-api') with module('javax.ws.rs:javax.ws.rs-api:2.0.1') 
    } 
} 

Der Abhängigkeitsbaum nicht mehr schließt die javax.ws.rs:jsr311-api Abhängigkeit und nicht mehr MethodNotFound- Ausnahme für die Methode javax.ws.rs.core.Application.getProperties (...).

1

Ich bin nicht sicher, dass dies der beste Weg ist, aber es funktioniert:

configurations.all { 
    resolutionStrategy.dependencySubstitution { 
    all { DependencySubstitution d -> 
     if (d.requested instanceof ModuleComponentSelector && d.requested.name == 'jsr311-api') { 
     d.useTarget group: d.requested.group, name: 'javax-ws-rs-api', version: d.requested.version 
     } 
    } 
    } 
} 

Aktualisiert:

Es ist möglich, so eine andere Art und Weise mit nebula.resolution-rules Plugin und eine solche Konfiguration zu tun:

replace-jsr.json

{ 
    "replace" : [ 
     { 
     "module" : "javax.ws.rs:jsr311-api", 
     "with" : "javax.ws.rs:javax-ws-rs-api", 
     "reason" : "The JSR spec jar maven coordinates changed for 2.0 and later", 
     "author" : "Andreas Lundgren", 
     "date" : "2016-08-08T00:00:00.000Z" 
     } 
    ], 
    "align": [], 
    "substitute": [], 
    "deny": [], 
    "reject": [] 
} 
+0

Vielen Dank für die Eingabe! Ich habe es nicht direkt benutzt, der Nebel ist ein bisschen übertrieben für mich, aber er hat mich definitiv auf den richtigen Weg gebracht! –