Подтвердить что ты не робот

Gradle: переопределить транзитивную зависимость по классификатору версии

Одна из зависимостей, объявленных в моем проекте, имеет транзитивную зависимость от 'com.google.guava:guava:15.0'. Но мое приложение, развернутое на WAS/Weblogic, не работает из-за проблемы с CDI, которая исправлена ​​в 'com.google.guava:guava:15.0:cdi1.0'. (такая же версия, но с классификатором). Мне нужно сообщить gradle, чтобы использовать эту банку во время сборки и упаковки. Я пытаюсь понять, как мы можем преобразовать эту транзитивную зависимость с классификатором конкретной версии jar.

Пробовал следующие действия:

  • Добавлена ​​зависимость явно: compile 'com.google.guava:guava:15.0:cdi1.0'. Но обе банки были включены в итоговую WAR.
  • Введена зависимость явно и определена стратегия разрешения:

    configurations.all {
        resolutionStrategy {
            force 'com.google.guava:guava:15.0:cdi1.0'
        }
    }
    

    Даже это не сработало.

  • Определена стратегия разрешения для проверки и изменения версии.

    configurations.all {
         resolutionStrategy.eachDependency { DependencyResolveDetails details ->
             if (details.requested.group + ":" + details.requested.name == 'com.google.guava:guava') {
                details.useVersion "15.0:cdi1.0"
                //details.useTarget "com.google.guava:guava:15.0:cdi1.0"
            }
        }
    }
    

    Даже это не сработало.

Вам нужны ваши предложения по решению этой проблемы.

4b9b3361

Ответ 1

В настоящее время классификаторы еще не учитываются, когда речь заходит о разрешенияхStrategies. Обходной путь для вас может исключить транзитивную guava lib при объявлении ваших зависимостей и добавлении версии guava cdi1.0 явно:

dependencies {
    compile ("org.acme:someDependency:1.0"){
        exclude group: 'com.google.guava', module: 'guava'
    }       
    compile "com.google.guava:guava:15.0:cdi1.0"
}

Ответ 2

Я наткнулся на более элегантный подход, который просто:

compile ("com.google.guava:guava:15.0:cdi1.0") {
  force = true
}

Объяснение

Настройка force = true для зависимостей сообщает gradle использовать указанную версию в случае конфликта версий

Ответ 3

Это не сработает, если одна и та же зависимость указана на другую банку. Способ Sureshot для исключения зависимости

configurations {
 all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}