Подтвердить что ты не робот

Как я могу заставить один модуль 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).

Что я делаю неправильно?

4b9b3361

Ответ 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 необходима в большинстве сценариев.