2015-12-22 3 views
2

Spring data gemfire 1.7.0.RELEASE имеет временные зависимости для компиляции версии 1.7.12 от slf4j-api и jcl-over-slf4j. Я определил ниже зависимости в моем файле Maven п, так как нам нужно SLF4J 1.7.10 зависимости (некоторые другие банки зависят от этого):Как разрешить slf4j зависимость весенних данных gemfire?

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-gemfire</artifactId> 
    <version>1.7.0.RELEASE</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.10</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.7.10</version> 
    <scope>runtime</scope> 
</dependency> 

У меня есть внутренний Maven репо в качестве центрального хранилища Maven. Ниже поведение я вижу в различных сценариях, основываясь на том, что банки доступны в Maven центральный:

enter image description here

Мои вопросы:

  1. В сценарии 1, я не понимаю почему сборка не жаловалась на отсутствие 1,7.12 баночки. Как была решена зависимость?
  2. В сценарии 2, как 1,7.10 баночка переопределяет 1.7.12 без меня, указав исключение для slf4j 1.7.12 в зависимости от весны данных?
  3. В сценарии 3, когда в центре Maven отсутствует pom для slf4j-parent 1.7.12, почему он жалуется? Поскольку присутствует 1,7,10 банок, разве сборка не должна хорошо собирать 1,7,10 банок (аналогично сценарию 1)?

ответ

1

Ответ основан на механизме Maven Dependencies Mediation, а именно это утверждение:

You can always guarantee a version by declaring it explicitly in your project's POM

Таким образом, по существу, явным образом объявить его как часть ваших зависимостей, вы перезаписываете любую версию на переходных зависимости, как вам не нужно добавлять какие-либо исключения. Вы заявляете об этом, у вас есть знания о проекте, Maven доверяет вам.

Итак, в сценариях 1 и 2 Maven применил правило выше и просто выполнило то, что указано в POM.
В сценарии , так как он не нашел ни одной версии 1.7.12, он даже не пытался ее разрешить и доверял вашему POM.
В сценарии он разрешил дерево зависимостей 1,7.12, но затем на основе вашего POM выиграла версия 1.7.10.
В сценарии он не смог разрешить все дерево зависимостей версии 1.7.12 и, как таковое, дал ошибку: да, версия из вашего POM выиграла бы в любом случае, но поскольку у Maven была ошибка при получении полное дерево зависимостей, оно не выполнило его.

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

Update
Что я хотел бы предложить, чтобы попытаться в трех сценариях, чтобы иметь немного больше деталей, чтобы запустить с консоли:

mvn dependency:resolve -Dsort=true -X 

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

В качестве дополнения, выполнив команду:

mvn dependency:tree 

даст вам полный граф зависимостей, показывая, что было на самом деле взяты из POM и что из зависимостей переходными. Это может дать вам дополнительную информацию. Для получения дополнительной информации я бы предложил посмотреть на цели Maven Dependency Plugin.

+0

Спасибо. В Сценарии 1, не должен ли он попытаться разрешить дерево зависимостей 1.7.12? –

+0

Действительно, это все еще единственный непонятный момент для меня, возможно, существует другое поведение, если зависимость не существует вообще, и POM переопределяет ее или если она есть, она начинает обрабатывать ее, а затем она терпит неудачу из-за недостающей части в графе зависимостей. Какую версию maven вы используете? –

+0

Я обновил свой ответ с дальнейшими подробностями. –