Gradle - исключить зависимость для конфигурации, но не для наследуемой конфигурации

Использование Gradle 1.0, веха 8.

Мой проект использует slf4j+Logback для ведения журнала, поэтому я хочу, чтобы любые транзитивные зависимости от log4j не загрязняли мой путь к классам. Таким образом, я добавил глобальное исключение, например:

configurations {
    all*.exclude group: "log4j", module: "log4j"
}

Однако я использую тестовую библиотеку ( hadoop-minicluster), которая во время выполнения зависит от log4j, поэтому теперь мне нужно разрешить зависимость от log4j. для моей тестовой среды. Я попытался добавить прямую зависимость от log4j:

testRuntime group: "log4j", name: "log4j", version: "1.2.15"

и отредактировать свой код исключения (что-то вроде хака):

configurations.findAll {!it.name.endsWith('testRuntime')}.each { conf ->
    conf.exclude group: "log4j", module: "log4j"
}

Но это не работает. Добавление исключения в конфиг testCompile автоматически добавляет его и ко всем наследуемым конфигурациям, включая testRuntime. И кажется, что это исключение переопределяет даже явную зависимость, которую я добавил.

Похоже, что это ожидаемое поведение для Gradle. Из документов :

Если вы определяете исключение для конкретной конфигурации, исключенная транзитивная зависимость будет отфильтрована для всех зависимостей при разрешении этой конфигурации или любой наследуемой конфигурации .

Так есть ли другой способ сделать то, что я хочу достичь?

Идеи:

  • Создайте новую конфигурацию conf myTestRuntime, которая не расширяется от testCompile, и используйте ее для моего тестового пути к классам.
    • Но тогда мне придется продублировать все зависимости как для testCompile, так и для myTestRuntime.
  • Удалить исключения на уровне конфигурации. Для всех конфигов, кроме testRuntime, прокрутите зависимости и вручную удалите log4j (или добавьте исключение на уровне dep для log4j).
    • Это вообще возможно? Configuration.allDependencies доступен только для чтения.

18
задан Tunaki 28 August 2015 в 12:34
поделиться