2010-03-24 3 views
12

Хорошо, я думал, я понял, как использовать 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. Аналогично, из командной строки, если я перехожу в директории или B и попробую запустить mvn compile, я получаю сообщение «Ошибка сборки: не удалось разрешить артефакт».

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

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

ответ

22

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

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

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

Hint: If you open a project that other projects depend on, the icon in other projects changes to a "maven project" icon to denote that the IDE knows about link between the projects. However such a link is only established when the groupId, artifactId and version all match in the dependency and project declaration. Frequently occurring problem is that you change an API signature in your library project, but the application is not picking up. Often it's caused by the fact that the application is using an older version of the library artifact. The artifact icon can help you track down these problems.

+0

Спасибо. Я как-то знал об использовании 'mvn package' вместо' mvn compile', но спасибо за напоминание. Однако ссылка «Maven Best Practices» на wiki.netbeans.org была особенно полезна, поэтому я отмечаю этот ответ как принятый. –

+0

@ Даниэль. Добро пожаловать. Но сторона примечания была больше о 'mvn package' vs' mvn jar: jar' :) Рад, что вы нашли ссылку полезной, хотя. –

+0

Возможно ли запустить модуль 'install' как часть' compile' родителя? –

6

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

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

3

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

Смежные вопросы