2016-01-27 3 views
6

мы запускаем приложение с пружинным приложением с градиентом.Удалить переходную зависимость от класса в градиенте

Для того, чтобы включить в весенне-загрузочный плагин мы добавим его в зависимости:

buildscript { 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE") 
    } 
} 

К сожалению, этот плагин поставляется с зависимостью к org.apache.logging.log4j:log4j-slf4j-impl:2.4.1

Что я хотел бы исключить.

Уже пробовал, добавив:

dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE") { 
      exclude group: 'org.apache.logging.log4j' 
     } 
    } 

Который не работает.

Кроме того, добавив:

configurations { 
    classpath.exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' 
} 

Не имеет никакого эффекта.

Подсказка приветствуется.

ответ

0

Как-то проблема в том, что я объявил log4j как во время выполнения зависимости:

ext { 
     log4jVersion="2.5" 
    } 
    runtime (
      "org.apache.logging.log4j:log4j-slf4j-impl:$log4jVersion", 
      "org.apache.logging.log4j:log4j-api:$log4jVersion", 
      "org.apache.logging.log4j:log4j-core:$log4jVersion" 
     ) 

, которые приводят к случаю, версия 2.4.1 была извлекаться некоторым редактором магии, как компилировать зависимость.

У меня тогда было 2.4.1 и 2.5 на пути к классам.

Как только я объявил log4j, как зависимость компиляции 2.4.1 нет ...

4

Если вы пытаетесь исключить

org.apache.logging.log4j:log4j-slf4j-impl:2.4.1 

Попробуйте

dependencies { 
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE") { 
     exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' 
    } 
} 
+0

Для меня, кажется, что исключает в пути к классам, не имеет никакого эффекта ... – questionare

+0

waiiiit минуты! [spring-boot-gradle-plugin] (http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-gradle-plugin/1.3.2.RELEASE) не имеет log4j-slf4j-impl как транзитивная зависимость. Он идет откуда-то еще. – RaGe

+0

Mhm no, как только я удаляю его из сценария градации, зависимость также исчезла. – questionare

2

Я обычно Откат к этому, когда я хочу, чтобы убедиться, что зависимость не добавляется к проекту.

configurations { 
    all*.exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl', version '2.4.1' 
} 

Но вы уверены, что вам нужно исключить зависимость. Он не должен быть частью сборщика/войны. Вы можете проверить все зависимости, используя «зависимости gradlew».

+0

это не сработает, так как я хотел бы использовать версию 2.5. Извините, я не упоминал об этом в вопросе. – questionare

+0

Я не использовал его раньше, но вы также можете добавить версию к исключению. Я соответствующим образом обновил ответ. – ssindelar

+1

Нет, это невозможно – questionare

2

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

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

gradle dependencyInsight --dependency someDependency находит все места, в которые может входить зависимость. Если у вас несколько версий, это поможет сделать его очевидным, когда версии возникнут.

В моем журнале ввода данных явным образом объявляется как зависимость времени компиляции, поэтому она отображается ниже.Если log4j был где-то еще, вы увидите библиотеку с нарушением, а также объявление времени компиляции для v 2.5.

Я должен был выполнить это явно для каждого дополнительного модуля.

$ gradle util:dependencyInsight --dependency org.apache.logging.log4j 
Configuration on demand is an incubating feature. 
:util:dependencyInsight 
org.apache.logging.log4j:log4j-api:2.5 
+--- compile 
\--- org.apache.logging.log4j:log4j-core:2.5 
    \--- compile 

org.apache.logging.log4j:log4j-core:2.5 
\--- compile 

(*) - dependencies omitted (listed previously) 

BUILD SUCCESSFUL 

Total time: 0.933 secs 

Теперь, когда вы знаете, где можно исключить зависимость, просто сделайте, как прежде, чтобы удалить ее. Вы можете подтвердить, запустив dependencyInsights снова

dependencies { 
    // found through `gradle dependencyInsight --dependency org.apache.logging.log4j` 
    classpath("someOtherGroup:someOtherArtifactId:1.0") { 
     exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' 
    } 
} 

Другим решением может быть переопределение распознаватель зависимость и заставить версию 2.5

configurations.all { 
    resolutionStrategy.eachDependency { DependencyResolveDetails details -> 
     if (details.requested.group == "org.apache.logging.log4j") { 
      println "Updating version for: $details.requested.group:$details.requested.name:$details.requested.version --> 2.5" 
      details.useVersion '2.5' 
     } 
    } 
} 

Мое мнение, я, вероятно, не хотят, чтобы добавлять проверки в resolutionStrategy все время, поэтому, вероятно, лучше просто отследить его в dependencyInsights. Также это означает обновление версии в двух местах, и если другой разработчик не знает о том, как работает, то у них будет «странное» поведение ... например. Я обновил log4j до 2.7, но он по-прежнему строит с 2.5?!?!

Но оба действительны подходы

Смежные вопросы