Яка різниця / співвідношення між цілями Мейвена та фазами? Як вони пов’язані між собою?
Яка різниця / співвідношення між цілями Мейвена та фазами? Як вони пов’язані між собою?
Відповіді:
Цілі виконуються на етапах, які допомагають визначити цілі порядку введення. Найкраще розуміння цього полягає в тому, щоб переглянути прив’язки життєвого циклу Maven за замовчуванням, які показують, які цілі запускаються в яких фазах за замовчуванням. Цілі фази компіляції завжди виконуватимуться перед цілями тестової фази, які завжди виконуватимуться перед цілями фази пакета тощо.
Частина плутанини посилюється тим, що при виконанні maven ви можете вказати мету або фазу. Якщо ви вказали фазу, то maven запустить усі фази до вказаної вами фази (наприклад, якщо ви вказали пакет, він спочатку буде проходити через фазу компіляції, а потім тестову фазу і, нарешті, фазу пакета), і для кожної фази вона буде виконати всі цілі, пов'язані з цією фазою.
Коли ви створюєте виконання плагіна у файлі збірки Maven, і ви вказуєте лише мету, він прив’яже цю мету до заданої фази за замовчуванням. Наприклад, мета jaxb: xjc за замовчуванням пов'язується з фазою генерування ресурсів. Однак, визначаючи виконання, ви також можете чітко вказати фазу для цієї мети.
Якщо ви вкажете ціль при виконанні Maven, вона виконає цю мету і лише цю мету. Іншими словами, якщо ви вкажете ціль jar: jar, вона запустить лише jar: jar мета, щоб упакувати ваш код у банку. Якщо ви раніше не виконували мету компіляції або не підготували скомпільований код іншим способом, це, швидше за все, може не вдатися.
mvn archetype:generate
, і в цьому випадку maven лише виконує мету?
mvn test
run:, --- 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:test
while mvn compiler:testCompile
just run --- maven-compiler-plugin:3.1:testCompile ...
.
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
клас тесту, на який посилається тестовий клас). Мабуть, фази не викликаються, якщо мета викликується явно.
Життєвий цикл - це послідовність названих фаз .
Фази виконуються послідовно. Виконання фази означає, що виконується всі попередні фази.Плагін - це сукупність цілей, яка також називається MOJO ( M aven O ld J ava O bject).
Аналогія: Плагін - це клас, а цілі - це методи всередині класу.
Maven базується на центральній концепції циклів побудови життя . Усередині кожного Будівництво циклів життя є Будівельний Phases , так і всередині кожне Будівництво фаз є Будівельні мети .
Ми можемо виконати або етап складання, або побудувати ціль. Під час виконання фази збірки ми виконуємо всі цілі побудови в рамках цієї фази збірки. Цілі побудови призначаються одній або більше фаз збірки. Ми також можемо виконати ціль збірки безпосередньо.
Існує три основні вбудовані життєві цикли :
Кожен життєвий цикл побудови складається з етапів
Наприклад, 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:
Зразок затемнення для картографування життєвого циклу Maven
[plugin-name]
у прикладі mvn [plugin-name]:[goal-name]
- швидше префікс плагіна . mvn clean install
не може лише " використовуватись у багатомодульному сценарії ". Мультимодуль - це зовсім інша тема.
Обрана відповідь чудова, але все ж я хотів би додати щось невелике до теми. Ілюстрація.
Це наочно демонструє, як різні фази прив'язуються до різних плагінів та цілі, які ці плагіни піддають.
Отже, давайте розглянемо випадок запуску щось на кшталт mvn compile
:
mvn compile
цього відображено конкретну мету, мета складання.mvn compiler:compile
Тому етап складається з цілей плагіна .
Посилання на посилання
mvn test
вказує package
і mvn install
вказує deploy
?
jar
плагін насправді працює у package
фазі. А пам’ятка в сендвіч між фазами та плагінами трохи заплутана (я припускаю, це повинно означати, що в пам’яті ви можете налаштувати, які плагіни виконуються в яких фазах, крім прив’язки за замовчуванням). Загальний принцип, правда, правда.
Визначення детально описані на сторінці сайту Maven Вступ до життєвого циклу побудови , але я спробував підсумувати :
Maven визначає 4 елементи процесу збирання:
Життєвий цикл
Три вбудованих в життєвому циклі (ака будує життєвий цикл ): default
, clean
, site
. ( Довідник життєвого циклу )
Фаза
Кожен життєвий цикл складається з етапів , наприклад , для default
життєвого циклу: compile
, test
, package
, install
і т.д.
Підключати
Артефакт, що забезпечує одну або кілька цілей.
Виходячи з типу упаковки ( jar
, war
тощо), цілі плагінів за замовчуванням пов'язані з фазами. ( Вбудовані прив'язки життєвого циклу )
Мета
Завдання (дія), яке виконується. Плагін може мати одну або кілька цілей.
Одну чи більше цілей потрібно вказати під час налаштування плагіна в POM . Крім того, у випадку, якщо для плагіна не визначена фаза за замовчуванням, зазначені цілі можуть бути пов'язані з фазою.
Maven можна викликати за допомогою:
clean
, package
)<plugin-prefix>:<goal>
(наприклад dependency:copy-dependencies
)<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
Build Phase
, я вважаю це ще однією фазою життєвого циклу, і це мене бентежить.
Я вважаю, що хороший відповідь вже передбачений, але я хотів би додати просту в наступну діаграму різних 3 життєвих циклів ( build
, clean
і site
) і фаз в кожному.
Фази жирним шрифтом - основні фази, які зазвичай використовуються.
generate-resources
з’являється двічі і generate-sources
відсутня.
Кредит Сандіпу Джиндалу та Премраю. Їх пояснення допомагають мені зрозуміти, коли заплутався з цього приводу на деякий час.
Я створив декілька прикладів повного коду та кілька простих пояснень тут 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 або 3 цілями
Приклад: - якщо ви запускаєте mvn clean
це фаза виконає мету mvn clean: clean
Мета: Мейвенська мета, обмежена фазою
для довідок http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
Існують наступні три вбудовані життєві цикли:
За замовчуванням життєвий цикл -> [перевірити, ініціалізувати, генерувати-джерела, джерела процесів, генерувати-ресурси, процес-ресурси, компілювати, класи-процеси, генерувати-тести-джерела, джерела-тести-джерела, генерувати-тестувати-ресурси, процес -тест-ресурси, тест-компіляція, процес-тест-класи, тест, підготовка-пакет, пакет, попередня інтеграція-тест, інтеграція-тест, пост-інтеграція-тест, перевірка, установка, розгортання]
Чистий життєвий цикл -> [попередньо очистити, очистити, після очистити]
Сайт життєвого циклу -> [попередній сайт, сайт, пост-сайт, розгортання сайту]
Потік є послідовним, наприклад, для життєвого циклу за замовчуванням , він починається з перевірки , потім ініціалізації тощо.
Ви можете перевірити життєвий цикл, включивши режим налагодження, mvn
тобто,mvn -X <your_goal>