Почему maven распознает зависимости только от установленных файлов POM? - PullRequest
6 голосов
/ 04 мая 2011

У меня есть проект с Maven, в котором один подпроект (A) хочет зависеть от другого подпроекта (B), который использует упаковку «pom».

Если я сделаю это простым способом, где Aопределяет зависимость от B с <type>pom</type>, все работает отлично, если я выполняю "mvn install", но если я запускаю какой-либо этап раньше, чем установка, такой как mvn compile или mvn package, то происходит сбой при попытке построить A:он ищет pom B в хранилище и не находит его.

Мне не нужен этот pom в хранилище, потому что он является частью нашего активного исходного кода и часто меняется.

Для всех jar-упакованных проектов, которые мы создаем, кажется, что это прекрасно работает, чтобы не допустить их в хранилище, сборка с mvn package, и Maven знает, как найти все зависимости в источнике и построить деревья, которыми он управляет безприбегая к хранилищу;однако для упакованного в pom проекта он всегда хочет перейти в хранилище.

Несколько вещей, которые я узнал, пытаясь понять это:

Есть ли способ, которым я могу указать подпроект POM как зависимость другого подпроекта в том же родительском проекте, без установки проекта POM в хранилище?

Ответы [ 2 ]

4 голосов
/ 04 мая 2011

Вопрос не только в том, какие цели связаны с какими фазами жизненного цикла проектов POM. Если бы это было так, то связывание цели «пакета» решило бы проблему.

При создании многомодульного проекта Maven считывает POM всех модулей, чтобы определить зависимости между модулями, чтобы он мог построить зависимые модули перед зависимыми модулями. Это может быть достигнуто даже при выполнении цели «package» (такой, что зависимые модули еще не находятся в локальном хранилище).

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

  • зависимость JAR вне проекта, где он ищет POM в локальном хранилище, обрабатывает его зависимости и добавляет JAR-файл POM в classpath
  • внепроектная зависимость pom, где она ищет POM в локальном хранилище и обрабатывает свои зависимости
  • внутрипроектная зависимость jar, где она ищет POM в дереве проекта, обрабатывает его зависимости и добавляет папку target / classes этого модуля в classpath
  • внутрипроектная зависимость pom, когда по какой-то причине она не ищет POM в дереве проекта и поэтому не обрабатывает свои зависимости.

Обратите внимание на асимметрию в двух последних случаях по сравнению с первыми двумя.

Я вижу два решения вашей проблемы. Один из них - подать отчет об ошибке, или, скорее, запрос на изменение поведения (поскольку он явно преднамеренный), возможно, только в случае внутрипроектных зависимостей от многомодульных проектов. Или действительно предложить патч. Но так как поведение является преднамеренным, вы можете встретить отказ. В лучшем случае вас ждет долгое ожидание. (Хотя я бы проголосовал за ваше сообщение об ошибке - меня ужалило то же поведение в другом контексте.)

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

0 голосов
/ 04 мая 2011

Конфигурирование maven-install-plugin для запуска на этапе компиляции и копирование соответствующего pom.xml в репозиторий, кажется, выполняет то, что я хотел, в том, что касается самого Maven, хотя m2eclipse все еще не радует (он выбрасывает«Не удалось прочитать дескриптор артефакта» без дополнительного описания файла pom.xml, который зависит от другого проекта POM).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...