Як створити порожній багатомодульний проект Maven?


75

Зараз я зазвичай знаходжу в Інтернеті pom.xmlфайл, який має pomупаковку, і копіюю та вставляю його для створення мого батьківського проекту. Потім я працював archetype:createу батьківському каталозі для створення підмодулів, але archetype:createз тих пір застарів.

Будь-які рекомендації щодо створення нових багатомодульних проектів Maven?

java  maven 

Відповіді:


125

Найпростіший спосіб зробити це - використовувати pom-rootархетип для створення пам’яті верхнього рівня, а потім неодноразово використовувати archetype:generateдля створення кожного модуля окремо. Це автоматично додасть модулі до кореневого pom (агрегатора) і встановить кореневий pom як батьківський pom для кожного модуля (редагувати: очевидно, деякі архетипи можуть мати жорстко закодований батько, але це працює для maven-archetype-quickstart).

Ось розбивка:

  1. Створіть корінь верхнього рівня:

    mvn archetype:generate \
    -DarchetypeGroupId=org.codehaus.mojo.archetypes \
    -DarchetypeArtifactId=pom-root \
    -DarchetypeVersion=RELEASE
    
  2. cd у ваш щойно створений кореневий каталог.

  3. Для кожного модуля:

    mvn archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DarchetypeVersion=RELEASE
    

Зверніть увагу, що -DarchetypeVersion=RELEASEвище буде автоматично використано останню версію архетипу. Ви можете додати -DgroupId=...до кожної з цих команд, щоб уникнути повторення.


3
Використання -Dfilter = pom-root дасть вам один вибір без необхідності вибору групи архетипу та ідентифікатора артефакту, і якщо ви відкинете archetypeVersion, це лише кілька варіантів для вибору. Це може бути простішим шляхом для тих, хто не хоче друкувати. :-)
Спенсер Кормос

Я вважав, що скопіювати / вставити найкраще для тих, хто не хоче друкувати;), тому я зробив команди багаторядковими для спрощення копіювання / вставлення.
Chris H.

Правда, але я просто додавав для перевірки майбутнього. :-D
Спенсер Кормос

7
Сумно, що я все одно приходжу до SO, щоб скопіювати та вставити це, а не мати можливість просто покладатися лише на утиліту mvn.
Даніель Герсон

1
Чудово! Дякую за підказку.
запитання

46

Ось скрінкаст про те, як ви можете це зробити за допомогою Intellij Idea. Спочатку запустіть новий проект (Файл -> Новий проект), виберіть «Модуль Maven»:

введіть тут опис зображення

Введіть ім'я, натисніть далі, не змінюйте нічого іншого на наступних кроках, натисніть кнопку Готово.

Тепер pom.xmlвведіть ваш тип <packaging>і ввімкніть автоматичне оновлення:

введіть тут опис зображення

Введіть модулі:

введіть тут опис зображення

Наведіть курсор на m1і натисніть Alt+Enter.

введіть тут опис зображення

Модуль m1буде автоматично доданий до вашого проекту. Тепер ви можете зробити Alt+Enterдля m2і все.

введіть тут опис зображення

Ви також можете почати з додавання pom.xmlдля існуючого модуля вашого проекту: клацніть правою кнопкою миші на ньому в дереві проекту, "Додати підтримку Framework ...", виберіть "Maven". Це створить pom.xml.


Чоловіче, це була дивовижна та корисна відповідь. Чи можу я піти за вами у відповідях на твіттер / stackoverflow тощо?
Rinor

Переконайтеся, що ви обертаєте ці <module>m1</module>внутрішні <modules>теги. Я новачок у файлі pom, і в підсумку витратив досить багато часу на те, чому alt + enterне відображаються жодні згадані варіанти.
unknownerror

21

mvn archetype:createбуло припинено на користь mvn archetype:generate, тому просто назва змінена. В офіційних сховищах є архетип для багатомодульних проектів, тому запуск цієї команди дає (мінімалістичний) результат:

[axe@gromp test]$ mvn archetype:generate
..
<num>: remote -> pom-root (Root project archetype for creating multi module projects)
..
Choose a number: 109: <num>
.. 

[axe@gromp test]$ tree 
.
└── modules.test
    └── pom.xml

1 directory, 1 file

[axe@gromp test]$ cat modules.test/pom.xml 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>modules.test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>modules.test</name>
</project>

Отже, в основному вам доведеться створити структуру папок та дескриптори модулів (файли pom.xml) самостійно. Використовуючи простий сценарій оболонки або командний файл, ви легко зробите це, якщо вам це потрібно більше одного разу.


FYI, номер, який потрібно вибрати для pom-root, змінився. На даний момент це 449.
mwoodman

@mwoodman Дякую за підказку. Я відредагував свою відповідь, щоб зробити її загальною для майбутніх змін.
Аксель Кнауф,

2
FYI число змінюється залежно від сховища, з якого ви його отримали.

2
Використання -Dfilter = pom-root виключає необхідність документування номерів і має звести результати до одного.
Спенсер Кормос

9

Я не впевнений, чи правильно розумію ваше запитання, але для створення мультимодульного проекту я зазвичай використовую простий pom (на кореневому рівні):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.vijaykiran</groupId>
  <artifactId>myproject-parent</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>m1</module>
    <module>m2</module>
  </modules>
</project>

Це, мабуть, найпростіший багатомодульний батьківський пом, яким ви можете скористатися. Проект, який ви хочете створити, може вже мати архетип, який може допомогти вам у створенні структури. Незважаючи на те, що ви можете отримати допомогу від IDE для написання пам’ятки самостійно, якщо для типу проекту, який ви хочете побудувати, доступний архетип, зазвичай його легше використовувати.


6
Я хочу сказати, що запам’ятовувати формат файлу POM важко, і писати його щоразу з нуля - марна трата часу. Таким чином, кожного разу, коли я хочу створити новий проект, я копіюю та вставляю вміст файлу pom і зберігаю його у своєму новому проекті pom.xml. Я шукаю більш дисциплінований та ефективний спосіб створення багатомодульних проектів. Наприклад, така інтерактивна команда archetype:generateзапитує мене, чи хочу я створити багатомодульний проект, і якщо так, то які саме модулі він містить, а потім створює pom.xmlфайли для мене.

6

Якщо ви працюєте з IDE eclipse, вам слід використовувати плагін m2eclipse . Це один з найпростіших способів створення багатомодульних проектів. Ви можете додати модуль до кожного проекту Maven, створивши "Проект модуля Maven" в межах eclipse. Роблячи це, ви маєте можливість вибрати батьківський проект. Плагін робить все, тобто копіює новий модуль у батьківський модуль та модифікує файл pom.xml.


5

Та сама відповідь, що і Кріс Х. Я щойно додав параметри groupId, artifactId та версію та вимкнув інтерактивний режим.

mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes \
    -DarchetypeArtifactId=pom-root \
    -DarchetypeVersion=RELEASE \
    -DinteractiveMode=false \
    -DgroupId=com.mycompany.app \
    -DartifactId=my-app \
    -Dversion=1.0.0-SNAPSHOT  \

4

Розглянемо закладки батьківського проекту та 3 підмодулі відпочинку, безпеку та модель, посилаючись на весняні документи . Він не має залежностей, як у документі Spring, лише базове налаштування з точки зору мультимодулів.

Створення батьківського проекту maven у неінтерактивному режимі / пакетному режимі

mvn archetype:generate \
-DarchetypeGroupId=org.codehaus.mojo.archetypes \
-DarchetypeArtifactId=pom-root \
-DarchetypeVersion=RELEASE \
-DgroupId=bookmarks \
-DartifactId=bookmarks \
-Dversion=0.0.1-SNAPSHOT \
-DinteractiveMode=false

Для створення підмодулів у неінтерактивному режимі / пакетному режимі.

cd у ваш щойно створений кореневий каталог. Посилаючись на відповідь @ Chris.H

-Dpackage - це структура пакета. Ось це закладки. Якщо не вказано, тоді артефакт буде розглядатися як пакет за замовчуванням

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=model \
-DartifactId=model \
-Dversion=0.0.1-SNAPSHOT \
-Dpackage=bookmarks \
-DinteractiveMode=false 

Щоб створити новий модуль у eclipse, перейдіть у меню Файл-> новий-> інший-> maven-> модуль maven, це негайно з'явиться у провіднику пакетів робочої області eclipse.

Або з cli, cd всередині батьківської папки, тут закладки і запустіть наступне, він створить проект, а потім вам доведеться імпортувати в eclipse як проект maven, або можете працювати від батьків, тут проект закладок

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=RELEASE \
-DgroupId=security \
-DartifactId=security \
-Dversion=0.0.1-SNAPSHOT \
-Dpackage=bookmarks \
-DinteractiveMode=false 

1

Прості 4 кроки, якщо ви хочете уникнути копіювання папки xml.

  1. Створіть 284 (за замовчуванням) проект архетипу. Відкрийте створений файл pom, змініть упаковку з jar на pom

  2. Видаліть папку src з проекту - це тепер батьківський проект без src, оскільки упаковка pom. У вищевказаній папці створіть ще один новий проект (за замовчуванням 284). Змініть упаковку на war або ejb або ear. Це стає підмодулем.

  3. Виконати mvn eclipse: затемнення на кожному модулі. Тепер проект повинен бути готовий до імпорту як проект Eclipse.

  4. Під час імпорту проекту Eclipse скаржиться, що наведена нижче конфігурація проекту не є актуальною за допомогою pom.xml. Запустіть Maven-> Update Project або скористайтеся Quick Fix. Щоб уникнути вищевказаної помилки, клацніть правою кнопкою миші та виберіть Швидке виправлення. Це оновить POMS. Інший спосіб уникнути цієї помилки - це декларування підмодулів у батьківському пом

Докладніше див. Посилання нижче. http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Example_1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.