Мевен: Життєвий цикл проти Фази проти Плагіна проти Цілі [закрито]


106

Тут відносно новий розробник, хоча я його використовую вже небагато часу, я сподіваюся затвердити свої основи Maven. Частина моєї проблеми полягає в тому, що я не маю досвіду роботи з Мурахом, який, здається, звідки походить багато пояснень. Я читав і переглядав підручники, і постійно чую ті самі умови:

  • Життєвий цикл
  • Фаза
  • Підключати
  • Мета

З того, що я дізнався, здається, що життєвий цикл є найширшим згустком і складається з (або завершених) фаз, плагінів та / або цілей.

Питання : Чи можете ви надати будь-яку інформацію про те, як пов’язані ці терміни та найпоширеніші приклади?

Чим явніше і базовіше, тим краще!



Дякую @Drejc - не можу повірити, що я не знайшов цього в пошуку. Я зараз прочитаю це.
Джефф Левін

2
Отже, для уточнення, побудуйте життєвий цикл = життєвий цикл , якого існує три типи: за замовчуванням, очищення та сайт? Інші пояснення змусили мене думати, що існує четвертий життєвий цикл, який називається збірка .
Джефф Левін


3
Занадто широкий? Це стосується основних основ Мейвена і має кілька хороших і детальних відповідей. Модераторам без єдиного тегу Maven не можна дозволяти вирішувати це.
Герольд Брозер

Відповіді:


73

Maven Життєвий цикл являє собою (абстрактне) поняття , яке охоплює всі етапи (або краще: всі кроки , Maven дизайнери вирішили підтримки) , які , як очікується, відбудеться в життя розвитку проекту. Ці етапи (або етапи) в термінології Мевена називаються фазами .

Maven плагін є контейнером для / постачальника цілей. Код, реалізований у цілях, - справжня робоча конячка. ( Сама по собі Maven - це просто управління плагінами та виконання цілей ). Кожна з цілей плагіна може бути призначена / прив'язана до будь-якої з фаз життєвого циклу.

При виклику mvn <phase> Maven проходить усі фази (кожен раз) і виконує всі цілі (поставлені плагінами) , які були пов'язані з будь-якою з фаз до і до (включаючи) дану фазу. Якщо є фаза, до якої не пов'язана мета, нічого не робиться. Але фаза все-таки пройшла.

Тобто ви не можете "" вставити "додаткові фази" в один із вбудованих життєвих циклів Maven. Вони вже є, завжди! Ви можете розробити власний життєвий цикл із власними фазами, але це далеко не просто використання Maven таким, яким він є.

Цілі також можуть бути виконані безпосередньо, про що вам повідомляється під час бігу mvnбез будь-якої фази або цілі [з розривами рядків і скороченими для читабельності тут]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Список літератури:

Якщо ви коли-небудь замислювались про те, як Мейвен знає, що робити без будь-якої мети, пов'язаної в POM, default-bindings.xmlна кінці знаходиться посилання на яке <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Фази для вбудованих життєвих циклів ( чисті , за замовчуванням , веб-сайт ) зазначаються в <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlпункті .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.


41

Мевен: Життєвий цикл проти Фази проти Плагіна проти Голи

Відповідаючи пізно, лише щоб уточнити ще один рівень деталізації, відсутній у цій темі: виконання (цілі), які є найменшими одиницями побудови Мавена.

Отже, ми маємо цикли побудови (в основному, набір дій для конкретної загальної мети), які складаються з фаз (нижча деталізація, крок циклу), які можуть викликати набір налаштованих цілей, наданих певними плагінами . Тобто Maven є (також) виконавцем плагінів, кожен плагін може запропонувати одну або кілька цілей. Потім ви (також) вирішуєте, яка мета пов'язана з якою фазою, більшість разів у життєвому циклі за замовчуванням (без будь-якого, тобто за замовчуванням). Але ви можете насправді мати ще один рівень: страти (з тієї самої мети, з того ж плагіна або з різними цілями з різних плагінів)

Малюнок, який я підготував, щоб відновити ціле введіть тут опис зображення

І справді, так це показує Maven (найменша одиниця роботи) через унікальну рядок у своєму журналі збирання:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

Наприклад, ми мали б:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

Що дійсно означає (через різні рівні деталізації):

  • під час compileфази (не згадується, на жаль)>
  • Я викликаю плагін ( artifactIdі version)> Maven Compiler
  • Я посилаюсь на його compileмету>
  • як визначено default-compileвиконанням

Це унікально, оскільки дійсно у вас може бути однакова ціль (одного і того ж плагіна), пов'язана з різними фазами або з тією ж фазою, але в різних виконаннях (тобто з різною конфігурацією). maven-compiler-plugin, Наприклад, також використовується під час test-compileфази (різні фази) для компіляції тестового коду ( з допомогою своєї testCompileмети) в іншому виконанні ( default-testCompile). Ви також можете скомпілювати (використовуючи той самий плагін і ціль) деякий автоматично згенерований код під час іншої фази, як визначено виконанням, яке ви вказали в POM (і, можливо, в іншій конфігурації).

Виконання за замовчуванням надається поза коробкою через прив'язки упаковки Maven , тобто за замовчуванням (і примушує конвенцію щодо конфігурації) Maven вже викликає певні цілі (стандартні плагіни) протягом певних етапів. Ідентифікатори виконання цих викликів за замовчуванням визначаються відповідно до певних умов .

Це також пояснює, чому, якщо ви дійсно хочете змінити поведінку за замовчуванням (прив'язку) збірки Maven, вам потрібно вказати (замінити) точно той самий ідентифікатор виконання у вашому POM для того ж плагіна. Наприклад, ви можете пропустити компіляцію, просто визначивши виконання maven-compiler-pluginтого ж default-compileid, але прив'язаного до неіснуючої фази (або порожнього).

Щоб коротко сказати : виконання повідомляє Мейвіну, яку мету (ів) виконати, яку конфігурацію на якій фазі.

Деякі виконання файлів надаються за замовчуванням (прив'язування за замовчуванням), що пояснює, чому основний мінімальний пом із лише 6 рядків може вже зробити багато (компіляція, тест, пакет тощо): виконання цілей стандартних плагінів на певних етапах: це домовленість про конфігурація. Потім за допомогою pom.xmlконфігурації ви можете додати речі (виконання) до збірки або впливати на поведінку вже налаштованих плагінів (у цьому випадку жодного executionsрозділу, але просто configurationвистачить).

Так, ви можете пропустити цикли складання (та їх фази) та безпосередньо викликати цілі (плагіни). Уявіть наступне:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(ПРИМІТКА. Ви також можете викликати вбудований номер лише в одному дзвінку)

Тут ми складаємо код програми, код тесту, виконуємо тести та пакет: уявіть, наскільки це буде ручним, схильним до помилок, повторюваним та трудомістким. Конвенція щодо конфігурації допомагає нам: Мейвен впроваджує побудову життєвих циклів та фаз . Життєвий цикл за замовчуванням (без імені, тобто за замовчуванням) забезпечує ряд фаз, заснованих на кращих практиках та конвенціях (мантра Мавена).
Якщо ви хочете досягти того самого, як описано вище, просто запустіть: mvn packageі він автоматично складе, протестує і пакує ваш проект. Як? виклик плагінів. Тобто, фази - це змістовний і настроюваний набір виконань плагінів (цілей). Щоб зробити його ще більш стандартним, для кожної фази Maven спочатку викликає будь-яку попередню фазу, так що, наприклад, якщо ви хочете перевірити, ви обов'язково спершу складете.

ps зауважте, що вказуючи кілька цілей на одну і ту ж execution, ви все одно чітко побачите в журналі складання два різні виконання (з однаковим ідентифікатором) для двох різних цілей (отже, все ще унікальний кортеж).


18

Заслуга Sandeep Jindal і Premraj (звідси Що таке цілі та фази Мевена і в чому їх відмінність? ). Їх пояснення допомагають мені зрозуміти.

Я створив кілька прикладів повного коду та кілька простих пояснень тут https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Я думаю, що це може допомогти іншим зрозуміти і можуть спробувати щось безпосередньо.

Якщо коротко, за посиланням, ви не повинні намагатися зрозуміти всіх трьох відразу, спочатку слід зрозуміти відносини в цих групах:

  • Життєвий цикл проти фази
  • Плагін - Гол

1. Життєвий цикл проти фази

Життєвий цикл - це сукупність фаз послідовно, дивіться тут Посилання на життєвий цикл . Коли ви викликаєте фазу , вона також буде викликати всі фази перед нею.

Наприклад, чистий життєвий цикл має 3 фази ( попередньо очистити, очистити, після очистити ).

mvn clean

Це буде називати попередньо очищеним та чистим .

2. Плагін проти цілі

Мета - це як дія в плагіні . Отже, якщо плагін - клас, мета - це метод.

Ви можете назвати ціль так:

mvn clean:clean

Це означає "заклик чистої мети до чистого плагіна" (тут нічого не стосується чистої фази. Не дозволяйте, щоб слово "чисто" заплутало вас, вони не однакові! Дивіться повне пояснення у моєму посиланні вище)

3. Тепер співвідношення фази та мети:

Фаза може (попередньо) посилатися на ціль (и). Для прикладу, як правило, чиста фаза посилається на чисту мету. Отже, коли ви викликаєте цю команду:

mvn clean

Він називатиме фазу попереднього очищення та чисту фазу, яка посилається на мету чистого: чистого.

Це майже те саме, що:

mvn pre-clean clean:clean

1
@ 2. і 3. IMHO, clean:cleanне найкращий вибір для прикладу. Існує 4 найменування предметів clean(життєвий цикл, фаза, плагін, мета), які можуть викликати заплутаність, особливо для початківців (я пам'ятаю, що це було для мене на початку). @ 3. Дієслово "посилання" теж не є добрим вибором, ІМХО. Офіційний термін Мейвена - « зв’язати ».
Герольд Брозер

@GeroldBroser. Повністю погоджуйтеся з чистим: чистим. Я пояснив і попередив про це в повному своєму поясненні за посиланням. Я скопію ці попередження і сюди. Причина того, що я використовував це, тому що добре повідомити людям про це заплутане слово, і, особливо, офіційний документ Maven використовує його, і це чітко пояснює. І так, мене це також бентежило. У будь-якому випадку, велике спасибі за коментарі
Surasin Tancharoen

помилка: офіційний документ Maven використовує його і не пояснює це чітко
Surasin Tancharoen

17

І запізніло інша схема

  • Життєві цикли у вигляді жовтих прямокутників
  • Фази життєвих циклів у вигляді синіх прямокутників із фазами «дзвінки» темно-синього кольору (тобто фази з гіпенацією зазвичай не викликаються з командного рядка, оскільки вони не можуть бути розроблені для того, щоб залишити проект у чітко визначеному стані).
  • Цілі, як сині пастилки. Показана асоціація / зв'язування "фаза -> мета" - це режим упаковки "jar" . Кожна фаза може мати цілі, пов'язані з нею. Звичайно, це стосується кожного життєвого циклу, хоча прив'язки показуються лише для "життєвого циклу" за замовчуванням.
  • Плагіни як сірі обрізані прямокутники. Плагіни забезпечують цілі, які можна прив’язати до Фаз.

Життєві цикли Maven, фази, цілі, плагіни


Файл graphml (відредагований безкоштовним редактором YEd
Девід Тонхофер

1) Що ви точно означаєте під "фазовими " фазами ", які є" темнішим синім "? Кожна фаза Мейвена є "дзвонючої" (хоча я швидше називаю її викликаючою , оскільки немає коду, який викликається безпосередньо шляхом виклику фази). Або ви називаєте фази " дзвінкими ", які мають для себе мету (за замовчуванням)? Навіть це неправда, якщо ви подивитесь validate, initializeі verify.
Герольд Брозер


3) modello:javaз Modello плагін , мабуть, до конкретного домену. Прив'язка мети плагіна до фази виконується для будь-якої з фаз.
Герольд Брозер

@GeroldBroser Виправлено відповідно до коментарів. "Callable" означає, що можна викликати його з командного рядка і очікувати, що проект залишиться у дійсному стані. Немає значущої різниці між дзвінками та викликом та дзвінками - це те, що використовує Вступ Maven .
Девід Тонхофер

12

Джерело це справді хороший підручник

Життєві цикли, фази життєвого циклу, плагіни та цілі плагіна - це серцевина Maven.

  • Команда Maven mvn може приймати як аргумент лише фазу життєвого циклу або ціль плагіна.
  • Maven постачається з трьома життєвими циклами - за замовчуванням, чистими та веб-сайтами.
  • Кожен життєвий цикл складається з фаз життєвого циклу. Загалом, це 28 фаз - 21 за замовчуванням ( перевірити, ..., компілювати, ..., упакувати, ..., встановити, розгорнути ), очистити 3 ( попередньо очистити, чистий, після очищення ) та 4 сайт ( попередній сайт, сайт, пост-сайт, розміщення сайту ).
  • коли фаза життєвого циклу викликається за допомогою команди mvn, всі попередні фази виконуються послідовно одна за одною.
  • Фази життєвого циклу самі по собі не мають можливостей виконати якесь завдання, і для їх виконання вони покладаються на плагіни.
  • Залежно від проекту та типу упаковки, Maven прив'язує різні цілі плагінів до етапів життєвого циклу, а цілі виконують покладене на них завдання.

Коли ми запускаємо " mvn пакет " у проекті Java, Maven прив'язує цілі плагінів до фаз життєвого циклу, як показано на наступному малюнку.

mvn-плагіни-пакет-мета


1
Матеріал, який ви згадали, досить хороший. Дякую!
Вільям Кінаан

@ " Команда Maven mvn може приймати як аргумент лише фазу життєвого циклу або ціль плагіна. " Неправильно. Він також приймає варіанти .
Герольд Брозер

" Коли ми запускаємо" mvn пакет "у проекті Java, Maven прив'язує цілі плагінів до етапів життєвого циклу " не відповідає дійсності. Прив'язка цілей відбувається задовго до запуску mvn ...: у замовчуванні-bindings.xml або в POM, і це робиться не Мевена, а людиною.
Герольд Брозер

7

Тож пояснити трохи далі, як викладено тут

Споруди Maven розділені за життєвими циклами:

  • чистий
  • збірка (за замовчуванням)
  • сайт

Кожен з цих циклів розбивається на фази. Наприклад, збірка розбита на фази, такі як:

  • підготувати ресурси
  • складати
  • пакет
  • встановити

Фази мають цілі , які повинні виконуватися до заздалегідь або після пост- фази, наприклад:

  • попереднє очищення - буде виконуватися до фази очищення
  • після очищення - буде виконано після фази очищення

Якщо ви хочете, цілі можна розглядати як додаткові "вставлені" фази. Прочитайте тут або подивіться відповідь @Gerolds для детальної інформації.


1
Ця відповідь не є правильною у повному обсязі. Дивіться мою відповідь .
Герольд Брозер

Хлопчик, 3 роки, відколи ти відповів на це питання ... і все ще не відпускаєш його ... ти переміг ... тепер рухайся далі.
Drejc

Справа не в тому, щоб виграти. Ви не переглядаєте старі питання, відповіді та коментарі, якщо натрапляєте на них пізніше?
Герольд Брозер

3

LifeCycle vs Phases: Life Cycle це колекція phases. Коли ви викликаєте фазу, вона також називатиме всі фази, що надходять до неї. Maven постачається з 3 вбудованими життєвими циклами:

  1. Чистий життєвий цикл - це включає очищення проекту (для нової збірки та розгортання)
  2. Життєвий цикл за замовчуванням / побудова - це обробляє повне розгортання проекту
  3. Життєвий цикл сайту - це обробка даних, що генерують документацію Java щодо проекту. введіть тут опис зображення

Чистий життєвий цикл має 3 фази: попереднє очищення, чисте та після очищення. Фази життєвих циклів за замовчуванням та фази веб-сайту такі ж, як показано на малюнку.


Ваш останній абзац вводить в оману. Особливо перше і останнє речення. Цілі та фази - це абсолютно різні речі. Ви не повинні плутати їх, оскільки деякі з них мають однакові назви. Re " Цілі - це фази, які ви бачите на малюнку вище. ": На малюнку немає жодної мети. Це все фази . Re « Ви пишете назву фази , як" мета " , коли ви повинні виконати певну мету. »: Незважаючи на те , що можна запустити завдання модуля явно звичайний спосіб полягає у виконанні збірки до певної фази з mvn <phase>. Дивіться мою відповідь тут.
Герольд Брозер

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