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

Использование 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 только для чтения.

Ответы [ 3 ]

8 голосов
/ 29 марта 2012

Пока мне удалось обойти проблему, но я все еще приветствую любые лучшие решения.

Вот что я в итоге сделал:

  • Добавить новую конфигурацию только для log4j:

    log4j(group: 'log4j', name: 'log4j', version: '1.2.15') {
        transitive = false
    }
    
  • Оставьте исключение на уровне конфигурации для всех конфигураций, кроме этой:

    configurations.findAll {!it.name.endsWith('log4j')}.each { conf ->
        conf.exclude group: "log4j", module: "log4j"
    }
    
  • Добавить конфигурацию log4j в classpath моих тестов:

    test {
        classpath += configurations.log4j
    }
    

Таким образом, мы можем получить log4j.jar в classpath, даже если он исключен из конфигурации testRuntime.

5 голосов
/ 21 августа 2015

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

configurations{
    runtime.exclude group: 'log4j'
}

test {
        classpath += configurations.compile
}
2 голосов
/ 29 марта 2012

Вам не нужно определять исключение. Если вы не перенастроили что-либо, конфигурация проекта testRuntime будет использоваться только для задачи test этого проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...