Що таке цілі та фази Мевена і в чому їх відмінність?


329

Яка різниця / співвідношення між цілями Мейвена та фазами? Як вони пов’язані між собою?



1
Можливий дублікат Maven: Lifecycle vs. Phase vs. Plugin vs. Goal

Відповіді:


251

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

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

Коли ви створюєте виконання плагіна у файлі збірки Maven, і ви вказуєте лише мету, він прив’яже цю мету до заданої фази за замовчуванням. Наприклад, мета jaxb: xjc за замовчуванням пов'язується з фазою генерування ресурсів. Однак, визначаючи виконання, ви також можете чітко вказати фазу для цієї мети.

Якщо ви вкажете ціль при виконанні Maven, вона виконає цю мету і лише цю мету. Іншими словами, якщо ви вкажете ціль jar: jar, вона запустить лише jar: jar мета, щоб упакувати ваш код у банку. Якщо ви раніше не виконували мету компіляції або не підготували скомпільований код іншим способом, це, швидше за все, може не вдатися.


11
Я звик говорити "Maven проходить всі фази (до та включаючи задані)" замість "run" або "Executes" (останній, як це називається у введенні Maven's Life Lifecycle ). Таке розрізнення стає зрозумілішим від коду цілі, який справді виконується. Але це може бути особистий смак.
ГерольдБрозер повертає Моніку

Але ми також можемо запускати цілі, які не належать до жодної фази, тобто mvn archetype:generate, і в цьому випадку maven лише виконує мету?
Куазі Ірфан

1
@Pace У вас є посилання на останній абзац? Я сумнівався в цьому і спробував це з простим проектом тут: mvn testrun:, --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:testwhile mvn compiler:testCompilejust run --- maven-compiler-plugin:3.1:testCompile ....
ГерольдБрозер повертає Моніку

4
@Pace mvn clean compiler:testCompileзапускається, --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileщо не спрацьовує Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase(де MvnPhaseклас тесту, на який посилається тестовий клас). Мабуть, фази не викликаються, якщо мета викликується явно.
ГерольдБрозер повертає Моніку

1
На підставі даних від geroldbroser та @ kekko12 я оновив останній параграф, щоб стверджувати, що, коли мета визначена, виконується лише ця мета, а не всі попередні етапи.
Темп

188

Життєвий цикл - це послідовність названих фаз .
Фази виконуються послідовно. Виконання фази означає, що виконується всі попередні фази.

Плагін - це сукупність цілей, яка також називається MOJO ( M aven O ld J ava O bject).
Аналогія: Плагін - це клас, а цілі - це методи всередині класу.

Maven базується на центральній концепції циклів побудови життя . Усередині кожного Будівництво циклів життя є Будівельний Phases , так і всередині кожне Будівництво фаз є Будівельні мети .

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

Існує три основні вбудовані життєві цикли :

  1. за замовчуванням
  2. чистий
  3. сайт

Кожен життєвий цикл побудови складається з етапів

Наприклад, defaultжиттєвий цикл складається з наступних фаз збірки :

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

Отже, щоб пройти вищезазначені фази, нам просто потрібно викликати одну команду:

mvn <phase> { Ex: mvn install }

Для вищевказаної команди, починаючи з першої фази, всі фази виконуються послідовно до фази «встановити». mvnможе виконати ціль або фазу (або навіть кілька цілей або кілька фаз) наступним чином:

mvn clean install plugin:goal  

Однак, якщо ви хочете налаштувати префікс, який використовується для посилання на ваш плагін, ви можете вказати префікс безпосередньо через параметр конфігурації на POMmaven-plugin-plugin у плагіні.

Фаза збірки складається із цілей плагіна

Більшість функціональних можливостей Maven знаходиться в плагінах. Плагін надає набір цілей, які можна виконати за допомогою наступного синтаксису:

 mvn [plugin-name]:[goal-name]

Наприклад, проект Java може бути скомпільований із метою компіляції-плагіна компіляційною метою mvn compiler:compile.

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

Цілі, надані плагінами, можуть бути пов'язані з різними фазами життєвого циклу. Наприклад, за замовчуванням мета compiler:compile пов'язана з compile фазою , тоді як мета surefire:test пов'язана з test фазою . Розглянемо таку команду:

mvn test

Коли виконується попередня команда, Maven виконує всі цілі, пов'язані з кожною з фаз до фази і включаючи її test. У такому випадку Мейвен виконує resources:resourcesмету, пов'язану з process-resourcesфазою, потім compiler:compileі так далі, поки нарешті не запустить surefire:testмету.

Однак, хоча фаза збірки відповідає за конкретний крок життєвого циклу побудови, спосіб виконання цих обов'язків може відрізнятися. І це робиться шляхом оголошення цілей плагіна, пов'язаних з цими фазами побудови.

Мета плагіна представляє конкретне завдання (тонше, ніж фаза збірки), яке сприяє побудові та управлінню проектом. Він може бути прив’язаний до нуля або більше фаз збірки. Мета, не пов'язана з жодною фазою збірки, може бути виконана поза життєвим циклом збірки шляхом прямого виклику. Порядок виконання залежить від порядку, в якому викликаються мета (цілі) та етап (и) складання. Наприклад, розглянемо команду нижче. Аргументи cleanта packageаргументи - це фази побудови, а dependency:copy-dependenciesмета - плагін.

mvn clean dependency:copy-dependencies package

Якби це було виконано, cleanфаза буде виконана спочатку (тобто вона буде виконувати всі попередні фази чистого життєвого циклу, плюс сама cleanфаза), а потім dependency:copy-dependenciesмета, перш ніж остаточно виконати packageфазу (і всі її попередні фази збірки життєвий цикл за замовчуванням).

Крім того, якщо мета пов'язана з однією або кількома фазами побудови, ця мета буде називатися на всіх цих фазах.

Крім того, фаза збірки також може мати нуль або більше цілей, пов'язаних з нею. Якщо фаза збірки не пов'язана з цілями, ця фаза збірки не виконується. Але якщо у нього пов'язана одна чи кілька цілей, вони виконають усі ці цілі.

Вбудовані прив'язки життєвого циклу
Деякі фази за замовчуванням пов'язані з ними. А для життєвого циклу за замовчуванням ці прив'язки залежать від вартості упаковки.

Maven Architecture:

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

Довідка 1
Довідка 2

Зразок затемнення для картографування життєвого циклу Maven

Зразок затемнення для картографування життєвого циклу Maven


Якщо у мене є 2 профілі, чи можу я спочатку запустити всі плагіни профілю 1, а потім профілю 2?
Бджола

[plugin-name]у прикладі mvn [plugin-name]:[goal-name]- швидше префікс плагіна . mvn clean installне може лише " використовуватись у багатомодульному сценарії ". Мультимодуль - це зовсім інша тема.
ГерольдБрозер повертає Моніку

Чи дотримуються цілі, приєднані до однієї фази, будь-якого порядку?
вугор ghEEz

5
Більшість цього тексту скопійована дослівно з документації Maven . Це слід чітко сказати!
Лій

дивовижне джерело!
Бобо

45

Обрана відповідь чудова, але все ж я хотів би додати щось невелике до теми. Ілюстрація.

Це наочно демонструє, як різні фази прив'язуються до різних плагінів та цілі, які ці плагіни піддають.

Отже, давайте розглянемо випадок запуску щось на кшталт mvn compile:

  • Це етап, який виконує плагін компілятора з метою компіляції
  • Плагін компілятора отримав різні цілі. Для mvn compileцього відображено конкретну мету, мета складання.
  • Це те саме, що біг mvn compiler:compile

Тому етап складається з цілей плагіна .

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

Посилання на посилання


20
чому mvn testвказує packageі mvn installвказує deploy?
Абдулл

2
Схоже, помилка ілюстрації, дякую за те, що помітили (заснували її в Інтернеті).
Джонні

3
Звідки ви взяли ілюстрацію? Ви перевіряли авторські права та умови використання?
Абдул

1
@Abdull зображення, зроблене звідси carminepagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (а також воно з’являється на багатьох інших веб-сторінках), додавши його до відповіді. Дякуємо, що підняли цю точку, не усвідомлювали її важливості.
Джонні

1
Покажчики від фаз до плагінів на діаграмі також не зовсім правильні; jarплагін насправді працює у packageфазі. А пам’ятка в сендвіч між фазами та плагінами трохи заплутана (я припускаю, це повинно означати, що в пам’яті ви можете налаштувати, які плагіни виконуються в яких фазах, крім прив’язки за замовчуванням). Загальний принцип, правда, правда.
Олександр Климечек

43

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

Maven визначає 4 елементи процесу збирання:

  1. Життєвий цикл

    Три вбудованих в життєвому циклі (ака будує життєвий цикл ): default, clean, site. ( Довідник життєвого циклу )

  2. Фаза

    Кожен життєвий цикл складається з етапів , наприклад , для defaultжиттєвого циклу: compile, test, package, installі т.д.

  3. Підключати

    Артефакт, що забезпечує одну або кілька цілей.

    Виходячи з типу упаковки ( jar, warтощо), цілі плагінів за замовчуванням пов'язані з фазами. ( Вбудовані прив'язки життєвого циклу )

  4. Мета

    Завдання (дія), яке виконується. Плагін може мати одну або кілька цілей.

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

Maven можна викликати за допомогою:

  1. фаза (наприклад clean, package)
  2. <plugin-prefix>:<goal>(наприклад dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(наприклад org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

з однією або кількома комбінаціями будь-яких або всіх, наприклад:

mvn clean dependency:copy-dependencies package

Тільки фази життєвого циклу насправді мають сенс розглядати як "кроки" (процесу збирання). Я вважаю за краще це 4 об'єкти / предмети / речі .
ГерольдБрозер повертає Моніку

Коли я бачу світ Build Phase, я вважаю це ще однією фазою життєвого циклу, і це мене бентежить.
Куазі Ірфан

26

Я вважаю, що хороший відповідь вже передбачений, але я хотів би додати просту в наступну діаграму різних 3 життєвих циклів ( build, cleanі site) і фаз в кожному.

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

Фази жирним шрифтом - основні фази, які зазвичай використовуються.


2
generate-resourcesз’являється двічі і generate-sourcesвідсутня.
elingerojo

12

Кредит Сандіпу Джиндалу та Премраю. Їх пояснення допомагають мені зрозуміти, коли заплутався з цього приводу на деякий час.

Я створив декілька прикладів повного коду та кілька простих пояснень тут 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

Більш детально та повні приклади наведені на https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/


2

Створити робочу термінологію з фазами та цілями.

Фаза: Фаза Мавена - це набір дій, який пов'язаний з 2 або 3 цілями

Приклад: - якщо ви запускаєте mvn clean

це фаза виконає мету mvn clean: clean

Мета: Мейвенська мета, обмежена фазою

для довідок http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html


4
Це не повинно бути "пов'язано з 2 або 3 цілями" обов'язково. Це може бути ніхто , один або більше трьох .
ГерольдБрозер повертає Моніку

1

Існують наступні три вбудовані життєві цикли:

  • за замовчуванням
  • чистий
  • сайт

За замовчуванням життєвий цикл -> [перевірити, ініціалізувати, генерувати-джерела, джерела процесів, генерувати-ресурси, процес-ресурси, компілювати, класи-процеси, генерувати-тести-джерела, джерела-тести-джерела, генерувати-тестувати-ресурси, процес -тест-ресурси, тест-компіляція, процес-тест-класи, тест, підготовка-пакет, пакет, попередня інтеграція-тест, інтеграція-тест, пост-інтеграція-тест, перевірка, установка, розгортання]

Чистий життєвий цикл -> [попередньо очистити, очистити, після очистити]

Сайт життєвого циклу -> [попередній сайт, сайт, пост-сайт, розгортання сайту]

Потік є послідовним, наприклад, для життєвого циклу за замовчуванням , він починається з перевірки , потім ініціалізації тощо.

Ви можете перевірити життєвий цикл, включивши режим налагодження, mvnтобто,mvn -X <your_goal>

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