2016-12-02 6 views
1

У меня есть проект с компиляцией зависимостей от Swagger, который приносит jackson-databind v2.4.5 и зависимость testCompile от библиотеки, которая использует AWS SDK, который приносит jackson-databind v2.6.6 ,Неверные зависимости в IntelliJ при импорте проекта из Gradle

При выполнении теста из Gradle, все работает отлично и правильно обновляется v2.6.6 зависимость джексон на пути к классам:

+--- io.swagger:swagger-jersey2-jaxrs:1.5.10 
| +--- io.swagger:swagger-jaxrs:1.5.10 
| | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.4.5 
| | | +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.6.6 
| | | \--- org.yaml:snakeyaml:1.12 -> 1.13 
| | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.4.5 
| | | +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.6.6 
| | | +--- com.fasterxml.jackson.core:jackson-databind:2.4.5 -> 2.6.6 

Зависимости IntelliJ содержат обе версии:

Both dependencies displayed

Однако при запуске тестов из IntelliJ IntelliJ создает «куст classpath» (потому что путь к классам слишком длинный). При проверке пути к классам в META-INF/MANIFEST.MF я вижу, что включен только меньший вариант (2.4.5).

Это вызывает исключение, когда тесты используют AWS SDK:

java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.enable([Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/databind/ObjectMapper; 

Поскольку старший джексон API не содержат этот метод.

Можно ли это предотвратить? В настоящее время я использую обходной путь, когда я добавил версию 2.6.6 зависимости jackson-databind в зависимостях testCompile. Но я хотел бы избежать этого, потому что

  1. Мы не используем Джексон непосредственно, это в Gradle сценария только из-за IntelliJ
  2. каждый раз, библиотеку, которая использует изменения SDK AWS, я буду также изменить зависимость Джексона

Обратите внимание, что мы используем тестовый бегун IntelliJ просто потому, что он быстрее, чем выполнение тестов с помощью градиента на локальных рабочих станциях (в основном из-за инкрементной компиляции).

ответ

0

Не могу сказать, почему у IDE все еще есть 2 версии этой библиотеки, хотя и зависевшие от Gradle зависимостей. Вы можете попробовать вручную исключить транзитивные зависимость от джексон-DataBind v2.4.5, что-то вроде этого:

compile('io.swagger:swagger-jersey2-jaxrs:1.5.10') { 
    exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' 
} 

А затем синхронизировать Gradle и проектов IDEA.

+0

Я не могу этого сделать, если я исключу зависимости от компиляции, приложение не будет работать. Если я запустил производственный код, будь то gradle или IntelliJ, есть только v2.4.5. – sm4

+0

О, я имею в виду, что вы можете добавить более новую версию в свои зависимости, если она работает для тестирования. Или вы можете исключить более новую версию из зависимости testCompile, если она не сломает сборку. Во всяком случае, это не нормально, тогда ваши тестовые и производственные зависимости различаются. – Stanislav

+0

Вот что я делаю прямо сейчас (см. Вопрос). Я помещаю правильную версию транзитивной зависимости в сценарий градации. Я ищу способ избежать этого, потому что это взломать. – sm4

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