2016-07-08 4 views
2

У меня есть проект в зависимости от исполнения Netflix Feign и Glassfish Jersey.Могу ли я сказать, что два разных модуля зависимостей на самом деле одинаковы и позволяют выбрать тот, который имеет самую высокую версию?

Feign использует спецификацию JAX-RS (JSR 311) 1.1, а реализация черной майки использует спецификацию 2.0. 2.0 обратно совместим, но изменено имя зависимостей Gradle.

Таким образом, у меня есть два зависимостей в моем проекте:

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

и реализует те же классы в же пакеты, но одно согласно 1.x и один в соответствии с 2.x

В моем Java-коде я могу указать только имя класса и пакет.

Могу ли я сказать Gradle, что на самом деле это тот же пакет, хотя имя отличается и таким образом получить только один набор реализующих классов в пути к классу?

В настоящее время это случайная версия классов, которую выбирают JVM и компилятор. Иногда он не компилируется, иногда компилируется, но не запускается (MethodNotFoundException).

+1

Я не думаю, что это возможно, но вы можете явно исключить старую зависимость. –

ответ

1

В конце концов, я добавил это к моему Gradle файл и он выглядит хорошо:

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

Дерево зависимостей больше не включает в себя зависимость javax.ws.rs:jsr311-api, и не более MethodNotFound- исключение для метода javax.ws.rs.core.Application.getProperties (...).

1

Я не уверен, что это лучший способ, но он работает:

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

Обновлено:

Это можно сделать, чтобы другой путь, используя nebula.resolution-rules плагин и такую ​​конфигурацию:

заменить-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

Большое спасибо за ввод! Я не использовал его напрямую, туманность немного переборщила для меня, но это определенно привело меня к правильному пути! –