Как я могу заставить один модуль Maven зависеть от другого?
ОК, я думал, что понял, как использовать 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).
Что я делаю неправильно?
Ответы
Ответ 1
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" значка для обозначения того, что IDE знает о связи между проектами. Однако такая ссылка есть только устанавливается, когда groupId, artifactId и версия все совпадают в зависимость и проект декларация. Часто встречающиеся проблема в том, что вы меняете API в вашем библиотечном проекте, но приложение не подбирает. Часто это вызвано тем, что приложение использует более старую версию библиотечного артефакта. Артефакт значок может помочь вам отследить эти проблемы.
Ответ 2
Вам нужно запустить mvn install
вместо mvn compile
. Цель install
будет скопировать встроенную банку в локальный репозиторий после компиляции и упаковки. Если вы выполняете компиляцию только, она будет компилировать файлы классов только в каталог target
и не делать их доступными для других проектов.
В Eclipse, если вы импортируете pom с верхнего уровня, он импортирует подпроекты в отдельные проекты Eclipse и настраивает зависимости связанных проектов, а затем настраивает каждый путь к классу проекта, чтобы он зависел от других. Я не знаком с Netbeans, но я уверен, что есть способ сделать то же самое.
Ответ 3
netbeans связывает проекты вместе с содержимым локального репозитория, поэтому установка mvn необходима в большинстве сценариев.
Ответ 4
Это неправда, выполнение развертывания сделает все предыдущие настройки...
Пожалуйста, взгляните на:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html