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