Эта зависимость дает мне две версии одного jar. Как мне это исправить?

#java #android #maven #gradle #jersey

#java #Android #maven #gradle #джерси

Вопрос:

Я использую Gradle для своего проекта. Одна из зависимостей, которые я указал в моем build.gradle, это
compile 'org.glassfish.jersey.media:jersey-media-moxy:2.0'

Это отлично работает в обычном Java-приложении, однако, когда я пытаюсь собрать его на Android, я получаю:

При взгляде на то, на какие библиотеки ссылаются, становится ясно, что есть обе, javax.inject-2.3.0-b05.jar и javax.inject-1.jar , которые, как я обнаружил, добавлены зависимостью выше. Я предполагаю, что этот «дублирующий» jar является причиной ошибки сборки.

Как мне обойти это? Почему зависимость включает в себя две одинаковые jar? Есть ли способ либо создать версию Android с этими двумя jar, либо удалить один из этих jar?

Ответ №1:

Похоже, у вас есть дерево зависимостей, похожее

 project
|--- org.glassfish.jersey.media:jersey-media-moxy:2.0
| --- *:javax.inject:1
--- *:javax.inject:2.3.0-b05
  

Где * — это группа, которая, как я подозреваю, может отличаться от этих двух.

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

 gradle dependency
  

Если вам нужно исключить зависимость, введите ее в тег, аналогично приведенному ниже примеру

 compile('org.hibernate:hibernate:3.1') {
  //excluding a particular transitive dependency:
  exclude module: 'cglib' //by artifact name
  exclude group: 'org.jmock' //by group
  exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
}
  

Ответ №2:

Обычно gradle будет включать только 1 jar для каждой зависимости. Если для тех же зависимостей найдена другая версия, будет использоваться более новая версия.

Однако в вашем случае эти 2 jar являются зависимостями с разными названиями групп:

 'javax.inject:javax.inject:1'
'org.glassfish.hk2.external:javax.inject:2.3.0-b05'
  

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

‘javax.inject:javax.inject: 1’ очень старый, я думаю, вам следует исключить его, как сказал Нильс Бек Нильсен.

Чтобы выяснить, откуда взялась эта зависимость, вы можете использовать command:

 gradle -q dependencyInsight --dependency inject