Использование Gradle 1.0 milestone 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 conf автоматически добавляет его также во все наследуемые конфигурации, включая testRuntime.И кажется, что это исключение отменяет даже явную зависимость, которую я добавил.
Похоже, что это ожидаемое поведение для Gradle.Начиная с Документы :
Если вы определите исключение для конкретной конфигурации, исключенная транзитивная зависимость будет отфильтрована для всех зависимостей при разрешении этой конфигурации или любой наследующей конфигурации.
Так есть ли другой способ сделать то, что я хочу достичь?
Идеи:
- Создать новый конф
myTestRuntime
это не распространяется на testCompile, и использовать его для моего теста classpath. - Но тогда мне нужно продублировать все зависимости как для testCompile, так и для myTestRuntime.
- Удалить исключения на уровне конфигурации.Для всех конфессий, кроме testRuntime, переберите зависимости и вручную удалите log4j (или добавьте исключение уровня на log4j).
- Возможно ли это вообще?Configuration.allDependencies только для чтения.