Как сделать так, чтобы один модуль Maven зависел от другого? - PullRequest
13 голосов
/ 25 марта 2010

ОК, я подумал Я понял, как использовать Maven ...

У меня есть мастер-проект M, в котором есть подпроекты A, B и C. C содержит некоторые общие функции (в основном интерфейсы), которые необходимы A и B. Я могу запустить mvn compile jar:jar из корневого каталога проекта (каталог M) и получить файлы JAR A.jar, B.jar и C.jar. (Версии для всех этих артефактов в настоящее время 2.0-SNAPSHOT.)

Главный pom.xml файл в каталоге M перечисляет C под своим тегом <dependencyManagement>, так что A и B могут ссылаться на C, просто включив ссылку, например так:

<dependency>
    <groupId>my.project</groupId>
    <artifactId>C</artifactId>
</dependency>

Пока все хорошо. Я могу запустить mvn compile из командной строки, и все работает нормально. Но когда я открываю проект в NetBeans, он жалуется на проблему: «Некоторые артефакты зависимости отсутствуют в локальном репозитории», и в нем говорится, что отсутствующий артефакт - C. Аналогично, из командной строки, если я перехожу в каталоги A или B и пытаюсь запустить mvn compile, я получаю сообщение «Ошибка сборки: не удалось разрешить артефакт».

Я ожидаю, что смогу вручную перейти туда, где был построен мой C.jar, и запустить mvn install:install-file, но я бы предпочел найти решение, позволяющее мне просто работать непосредственно в NetBeans (и / или в Eclipse с использованием m2eclipse).

Что я делаю не так?

Ответы [ 4 ]

23 голосов
/ 25 марта 2010

Maven опирается на концепцию бинарных зависимостей и разрешает их через локальный репозиторий. Другими словами, вам нужно «установить» пакеты в вашем локальном репозитории, если между ними есть зависимости, компиляции и упаковки кода недостаточно. И для этого вам нужно запустить install (что установит пакет в локальный репозиторий для использования в качестве зависимости в других проектах локально ).

Примечание: вы не должны вызывать mvn compile jar:jar, но предпочитаете mvn package. Во-первых, запуск фазы package активирует все фазы до package (включая compile) и package. Во-вторых, выполнение package вызовет jar:jar или war:war и т. Д. В зависимости от значения <packaging> проекта (см. Введение в жизненный цикл для получения дополнительной информации об этом). Это одна из сильных сторон Maven: вам не нужно знать, является ли проект JAR, WAR, EJB и т. Д., И выполнять соответствующую задачу для его упаковки. Просто запустите стандартизированную фазу package, и Maven выполнит эту работу (используя привязки целей по умолчанию).

Это было для теоретической части Maven. Внутри IDE все может немного отличаться, чтобы сделать работу с Maven более удобной. В IDE могут использоваться зависимости проекта (т.е. зависимости от кода внутри IDE) вместо двоичных зависимостей, так что изменения, сделанные в одном проекте, становятся видимыми в других модулях без необходимости запуска mvn install , Это случай Eclipse + M2Eclipse. И это относится также к NetBeans при следующих условиях (см. Управление зависимостями ):

Подсказка: Если вы откроете проект, другой проекты зависят от значка в другом проекты превращаются в "Maven Project" значок, обозначающий, что IDE знает о связи между проектами. Однако такая ссылка только устанавливается когда groupId, artifactId и версия все совпадают в зависимость и проект декларация. Часто встречающиеся проблема в том, что вы меняете API подпись в проекте вашей библиотеки, но приложение не забирает. Часто это связано с тем, что приложение использует старую версию из артефакта библиотеки. Артефакт значок может помочь вам отследить эти проблемы.

6 голосов
/ 25 марта 2010

Вам нужно запустить mvn install вместо mvn compile. Цель install скопирует собранный jar в локальный репозиторий после компиляции и упаковки. Если вы только запускаете compile, он только скомпилирует файлы классов в каталог target и не сделает их доступными для других проектов.

В Eclipse, если вы импортируете pom с верхнего уровня, он импортирует подпроекты в отдельные проекты Eclipse и устанавливает зависимости связанных проектов, а затем настраивает путь к классам каждого проекта в зависимости от других. Я не знаком с Netbeans, но уверен, что есть способ сделать то же самое.

3 голосов
/ 25 марта 2010

netbeans связывает проекты вместе с содержимым локального репозитория, поэтому установка mvn необходима в большинстве случаев.

0 голосов
/ 25 апреля 2013

Это не так, выполнение развертывания выполнит все предыдущие шаги ...

Пожалуйста, смотрите на:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

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