Модулі Maven + побудова єдиного конкретного модуля


383

У мене є кілька модулів Maven проект з батьківського проекту Pі три суб-модулів A, Bі C. Як Bі Cу військових проектах , і обидва залежать A.

Я можу надрукувати mvn compileв Pі мати все суб-модулі правильно складені. Проблема виникає, коли я хочу робити операції для конкретних модулів.

Я хотів би мати можливість упакувати війну для проекту B, але коли я запускаю команду пакета з Bкаталогу каталогу, він скаржиться, що не може знайти залежності для A.

Я розумію з цього питання: Maven і залежні модулі, які, можливо, Maven насправді не розроблені для такого типу вирішення залежності, але це ставить питання про те, як я пакую B?

  1. Чи потрібно балотуватися mvn packageна всю ієрархію проектів, коли мені дуже просто хочеться B?

  2. Чи потрібно мені встановлювати знімки A у свій локальний сховище кожного разу, коли я хочу упакувати B?

Цей другий сценарій не дуже цікавий, коли Aвін все ще знаходиться в активному розвитку.

Якісь найкращі практики тут?


можливий дублікат Maven та залежних модулів
oberlies

Відповіді:


694

Якісь найкращі практики тут?

Використовуйте вдосконалені варіанти реактора Maven , точніше:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Тож просто cdв батьківський каталог P і запустіть:

mvn install -pl B -am

І це створить B і модулі, необхідні B.

Зауважте, що вам потрібно використовувати двокрапку, якщо ви посилаєтесь на той, artifactIdякий відрізняється від імені каталогу:

mvn install -pl :B -am

Як описано тут: https://stackoverflow.com/a/26439938/480894


15
Для тих, хто потрапляє на цю сторінку в 2011 році, це краща відповідь. Зараз є краща підтримка мультимодулів у самому Maven (Maven 2.1 і вище), вам не потрібно використовувати плагін реактора.
Шпег

17
Ще один дуже корисний варіант - "-amd, - також зробити залежних", який будує всі модулі, залежні від проектів у списку реакторів.
відмовитись

1
Що з побудовою модуля онука?
Бакс

12
@Bax, використовуйте mvn install -pl .,parent/child,parent/child/grandchild Кома для розділення декількох проектів і. для батьків пом.
Нео

1
Коли я намагаюся clean packageмодуль таким чином, він не може вирішити залежності реактора, які ще не встановлені. З -amйого допомогою зайве відбудувати депа.
басейн

18

Say Батько pom.xml містить 6 модулів , і ви хочете , щоб запустити A , B і F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd в проект батьків

 mvn --projects A,B,F --also-make clean install

АБО

mvn -pl A,B,F -am clean install

АБО

mvn -pl A,B,F -amd clean install

Примітка. Коли ви вкажете проект із параметром -am , Maven створить усі проекти, від яких залежить вказаний проект (прямо чи опосередковано). Мейвен вивчить список проектів і спуститься по дереву залежностей, знайшовши всі проекти, які він потребує для створення.

У той час як команда -am робить усі проекти, необхідні конкретному проекту, у багатомодульній збірці, параметр -amd або - також зробити make- залежники налаштовує Maven для створення проекту та будь-якого проекту, який залежить від цього проекту. Використовуючи - також самостійно роблять залежності , Maven вивчить усі проекти в нашому реакторі, щоб знайти проекти, які залежать від конкретного проекту. Він автоматично будуватиме ці проекти та більше нічого.


8

Maven абсолютно був розроблений для цього типу залежності.

mvn package не встановить нічого у вашому локальному сховищі, він просто пакує проект і залишає його в цільовій папці.

Виконайте mvn installв батьківському проекті (A), при цьому всі підмодулі будуть встановлені у сховищі Maven вашого комп'ютера, якщо не буде змін, вам просто потрібно скомпілювати / упакувати підмодуль (B) і Maven візьме вже упакований і встановлено залежності як раз.

Вам потрібно просто mvn installв батьківському проекті, якщо ви оновили частину коду.


3
Під час розробки це було б кошмаром, зображення, що як тільки ви виправите підмодуль, вам доведеться встановити його, а потім запустити контейнер сервлетів. Життя коротке :(
hguser

7

Якщо ви раніше запустили mvn install у проекті B, він буде встановлений у вашому локальному сховищі, тож при складанні пакета A Maven може вирішити залежність. Отже, якщо ви встановлюєте проект B щоразу, коли ви змінюєте його, ваші версії для проекту A будуть актуальними.

Ви можете визначити багатомодульний проект з агрегатором пом для складання набору проектів.

Також варто згадати m2eclipse , він інтегрує Maven в Eclipse і дозволяє (за бажанням) вирішувати залежності від робочої області. Тож якщо ви злому кілька проектів, вміст робочої області буде використаний для компіляції. Після того, як ви задоволені своїми змінами, запустіть mvn install (для кожного проекту по черзі або використовуючи агрегатор), щоб помістити їх у своє місцеве сховище.


1
Чи є простий спосіб гарантувати встановлення всіх залежних проектів мого цільового проекту? Ієрархія, яку я маю, насправді набагато складніша, ніж описана тут, тому спробуйте пам’ятати, якщо я запустив mvn install для кожного залежного проекту, оскільки я востаннє робив зміни коду, може бути складним.
Брайан Ферріс

Так, використовуючи модулі для побудови набору проектів, дивіться посилання, додане до вихідної відповіді.
Багатий продавець

5

Погляньте на мою відповідь Maven та залежні модулі .

Плагін Maven Реактор призначений для вирішення будівельної частини проекту.

Конкретна мета, яку ви хочете використовувати reactor:make.


3
Це була правильна відповідь, але з Maven 2.1 вам більше не потрібно використовувати плагін для реактора. Подивіться на відповідь Паскаля в цій темі, що стосується "Розширених варіантів реактора"
Spedge

3

Ви кажете, що "справді просто хочете B", але це помилково. Ви хочете B, але ви також хочете оновити A, якщо в ньому були якісь зміни ("активний розвиток").

Отже, іноді вам потрібно працювати з A, B і C. Для цього випадку у вас є проект агрегатора P. Для випадку, коли ви хочете працювати з A і B (але не хочете C), слід створити проект агрегатора Q .

Редагувати 2016 : Вищенаведена інформація була, можливо, актуальною у 2009 році. Станом на 2016 рік, я настійно рекомендую ігнорувати це у більшості випадків та просто використовувати прапори -amабо -plкомандні рядки, як описано у прийнятій відповіді. Якщо ви використовуєте версію Maven з версії до v2.1, змініть цю першу :)


Grmphh ... тоді я закінчу стільки проектів агрегаторів, скільки проектів.
Кріс

@Kris Я б більше не рекомендував цього. Я залишу його тут, якщо хтось все-таки хоче знати, як, але я завжди використовую прапорці -am та -pl зараз. Я оновив свою відповідь.
Зак Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.