Стратегия разрешения ошибок в корневой сборке.gradle

#java #gradle #groovy #build.gradle

#java #gradle #groovy #build.gradle

Вопрос:

Можно ли указать resolutionStrategy в корне build.gradle , который применяется в подпроектах? Я могу заставить его работать, только если resolutionStrategy добавлен непосредственно в файл подпроекта build.gradle .

 subprojects {

    configurations.all {
        resolutionStrategy {
            eachDependency { DependencyResolveDetails details ->
                if(details.requested.group == 'org.apache.logging.log4j') {
                    details.useVersion '2.15.0'
                }
            }
        }
    }
}
 

Когда я помещаю это в свой root build.gradle и запускаю ./gradlew :subproject:dependencies , стратегия не применяется. Однако, когда я помещаю тот же блок конфигурации внутри подпроекта build.gradle , он работает так, как ожидалось.

Ответ №1:

Работает для меня так, как у вас с Gradle 7.3 в быстром тестовом проекте, который я написал:

 ➜  ./gradlew :module-a:dependencyInsight --dependency log4j

> Task :module-a:dependencyInsight
org.apache.logging.log4j:log4j:2.15.0 (selected by rule)
   variant "compile" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.environment     = standard-jvm
         org.gradle.jvm.version         = 17
   ]

org.apache.logging.log4j:log4j:2.14.1 -> 2.15.0
--- compileClasspath
 

Комментарии:

1. Ах, похоже, что каким-то образом плагин управления зависимостями spring boot переопределяет это. Возможно, он выполняется в определенном порядке, который сводит на нет resolutionStrategy. В проектах, отличных от spring, он работает без изменений. В весенних проектах я также должен установить ext['log4j2.version'] = '2.15.0' , и тогда все работает

2. Плагин управления зависимостями Spring немного «жадный», поэтому вы не можете точно смешивать оба стиля (Spring / Native Gradle). Посмотрите этот отличный доклад: youtube.com/watch?v=AADeX1AEmzU