Maven устанавливает транзитивные зависимости

У меня есть проект, и мне нужно установить библиотеку на Maven, чтобы я мог использовать ее в указанном проекте. Проблема, с которой я столкнулся, заключается в том, что указанная библиотека, скажем, libA, сама имеет зависимость, libB, которая также является сторонней.

Я добавил оба в свой локальный репозиторий, используя этот код:

mvn install:install-file -Dfile=VerBDConverter.jar -DgroupId=verbdconverter
-DartifactId=verbdconverter -Dversion=1.00 -Dpackaging=jar -DgeneratePom=true  

Сделал то же самое для lib 2. Проблема в том, что когда я иду в pom моего проекта и добавляю зависимость ‹> для libA, Maven не подбирает libB.

Вопрос: В конце концов, Maven должен получить зависимости от libA, но этого не произошло.


person ricardolecocq    schedule 11.04.2016    source источник
comment
Может помочь, если вы специально укажете имена своих зависимостей по этому вопросу, если это что-то вроде this продолжается... Обычно нам нужно воспроизвести проблему, прежде чем мы сможем помочь.   -  person Andrew Williamson    schedule 12.04.2016
comment
@andrew, спасибо, причина, по которой я не включил имена обеих библиотек, заключалась в том, что они были созданы моей собственной компанией и, следовательно, недоступны в репозитории Maven.   -  person ricardolecocq    schedule 12.04.2016
comment
Поскольку это корпоративная среда, вам следует подумать о настройке репозитория артефактов (например, Artifactory или Nexus) для размещения пользовательских библиотек вашей компании.   -  person dnault    schedule 12.04.2016


Ответы (2)


Так и должно быть, ведь Maven должен получить зависимости от libA, но этого не произошло.

Нет, в вашем случае Maven не узнает ни с того ни с сего, какие транзитивные зависимости потребуются libA, потому что libA была установлена ​​вручную и нигде нет следов libB.

Обычно транзитивные зависимости — это зависимости, определенные в разделе dependencies файла .pom, доступного как часть развернутого приложения. Файл .pom по сути является копией исходного файла pom.xml, переименованного в соответствии с именем библиотеки (т. е. artifactId-version.jar, затем artifactId-version.pom).

При разрешении зависимости maven также проверяет свой файл .pom и, таким образом, получает информацию о своих зависимостях (которые становятся транзитивными зависимостями) и строит (и извлекает) для него требуемый граф зависимостей (то есть повторяет один и тот же процесс для каждого и каждая объявленная зависимость).

Из официального Maven — Введение в механизм зависимостей

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

Примечание: полужирный мой. файлы проекта обычно представляют собой файлы pom.xml, переименованные в файлы *.pom после загрузки связанных артефактов в репозиторий Maven (или установки в локальный кэш Maven).


Из вашего вопроса вы использовали -DgeneratePom=true, поэтому вы не передали файл libA 'pom.xml, но новый был сгенерировано автоматически

Сгенерируйте минимальный POM для артефакта, если он не указан через параметр pomFile. По умолчанию true, если в локальном репозитории еще нет существующего POM.

Автоматически сгенерированный файл .pom будет почти пустым (координаты Maven (groupId, ArtifactId, версия), но в нем нет раздела dependencies), поэтому Maven будет рассматривать libA как библиотеку без транзитивных зависимостей: он не может ни найти, ни угадать.


Следовательно, у вас есть четыре решения (в порядке рекомендации):

  • В корпоративной среде настройте корпоративный репозиторий Maven ( как Arifactory, Nexus или Apache Archivia) и должным образом развернуть на нем эти библиотеки, или
  • Переустановите libA, используя pomFile вариант или
  • Вручную добавьте раздел dependencies в сгенерированный файл .pom и добавьте в него libB, или
  • Явно объявите libB в вашем потребительском pom.xml файле

Для дальнейшего чтения на SO:

person A_Di-Matteo    schedule 11.04.2016

Это может помочь вам:

call mvn install:install-file -Dfile=sqljdbc.jar -DgroupId=com.microsoft.jdbc -DartifactId=sqljdbc1 -Dversion=1.0 -Dpackaging=jar
call mvn install:install-file -Dfile=sqljdbc4.jar -DgroupId=com.microsoft.jdbc -DartifactId=sqljdbc4 -Dversion=4.0 -Dpackaging=jar
call mvn install:install-file -Dfile=sqljdbc41.jar -DgroupId=com.microsoft.jdbc -DartifactId=sqljdbc41 -Dversion=4.1 -Dpackaging=jar

Источник: https://github.com/Programmercito/osbo-framework/blob/master/libs/instala.bat

person Programmercito    schedule 11.04.2016