English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Жизненный цикл построения Maven

Maven 构建生命周期定义了一个项目构建跟发布的过程。

一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:

阶段处理Описание
验证  validate验证项目验证项目是否正确且所有必须信息是可用的
编译  compile执行编译源代码编译在此阶段完成
测试  Test测试使用适当的单元测试框架(例如JUnit)运行测试。
包装  package打包创建JAR/WAR包如在 pom.xml 中定义提及的包
检查  verify检查对集成测试的结果进行检查,以保证质量达标
安装 install安装安装打包的项目到本地仓库,以供其他项目使用
部署 deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。

Maven 有以下三个标准的生命周期:

  • clean:项目清理的处理

  • default(或 build):项目部署的处理

  • site:项目站点文档创建的处理

构建阶段由插件目标构成

一个插件目标代表一个特定的任务(比构建阶段更为精细),这有助于项目的构建和管理。这些目标可能被绑定到多个阶段或者无绑定。不绑定到任何构建阶段的目标可以在构建生命周期之外通过直接调用执行。这些目标的执行顺序取决于调用目标和构建阶段的顺序。

例如,考虑下面的命令:

clean 和 pakage 是构建阶段,dependency:copy-dependencies 是目标

mvn clean dependency:copy-dependencies package

这里的 clean 阶段将会被首先执行,然后 dependency:copy-dependencies 目标会被执行,最终 package 阶段被执行。

Clean 生命周期

当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:

  • pre-clean:执行一些需要在clean之前完成的工作

  • clean:移除所有上一次构建生成的文件

  • post-clean:执行一些需要在clean之后立刻完成的工作

Clean в mvn clean является тем же clean, в жизненном цикле, когда вы выполняете некоторую фазу, также будут выполнены все предыдущие фазы, т.е. если вы выполните mvn clean, будут выполнены следующие две фазы жизненного цикла:

pre-clean, clean

Если мы будем выполнять mvn post-clean, то будут выполнены следующие три фазы жизненного цикла:

pre-clean, clean, post-clean

Мы можем изменить поведение этой части, определяя цели в любой фазе жизненного цикла clean.

В ниже указанном примере мы добавим цель maven-antrun-plugin:run в фазы pre-clean, clean и post-clean. Таким образом, мы можем показвать текстовую информацию во всех фазах жизненного цикла clean.

Мы создали файл pom.xml в каталоге C:\MVN\project.

<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.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
   <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.1</version>
   <executions>
      <execution>
         <id>id.pre-clean</id>
         <phase>pre-clean</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>pre-clean phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.clean</id>
         <phase>clean</phase>
         <goals>
          <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>clean phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.post-clean</id>
         <phase>post-clean</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>post-clean phase</echo>
            </tasks>
         </configuration>
      </execution>
   </executions>
   </plugin>
</plugins>
</build>
</project>

Теперь откройте консоль командной строки,перейдите в каталог,где находится pom.xml,и выполните следующую команду mvn.

C:\MVN\project>mvn post-clean

Maven будет начать обработку и покажет все фазы жизненного цикла clean.

[INFO] Поиск проектов...
[INFO] ------------------------------------------------------------------
[INFO] Сборка Безымянного - com.companyname.projectgroup:project:jar:1.0
[INFO]    task-segment: [post-clean]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-clean}]
[INFO] Executing tasks
     [echo] pre-clean phase
[INFO] Executed tasks
[INFO] [clean:clean {execution: default-clean}]
[INFO] [antrun:run {execution: id.clean}]
[INFO] Executing tasks
     [echo] clean phase
[INFO] Executed tasks
[INFO] [antrun:run {execution: id.post-clean}]
[INFO] Executing tasks
     [echo] пост-чистка этап
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Sat Jul 07 13:38:59 IST 2012
[INFO] Final Memory: 4M/44M
[INFO] ------------------------------------------------------------------

Вы можете попробовать изменить команду mvn clean, чтобы показать pre-clean и clean, и не выполнять никакие действия на этапе post-clean.

Default (Build) жизнь

Это основная жизнь Maven, которая используется для строительства приложений, включая следующие 23 этапа:

Этапы жизниОписание
validate (проверка)Проверка правильности проекта и наличия всех необходимых данных для завершения процесса строительства проекта.
initialize (инициализация)Инициализация состояния 构建, например, настройка значений свойств.
generate-sources (создание исходного кода)Создание любого исходного кода, включенного в этап компиляции.
process-sources (обработка исходного кода)Обработка исходного кода, например, фильтрация случайных значений.
generate-resources (создание ресурсов)Создание ресурсов, которые будут включены в проектный пакет.
process-resources (обработка ресурсов)Копирование и обработка ресурсов в целевую директорию, чтобы最好 подготовиться к этапу打包а.
compile (компиляция)Компиляция исходного кода проекта.
process-classes (обработка классных файлов)Обработка файлов, сгенерированных компиляцией, например, улучшение оптимизации байт-кода Java class файлов.
generate-test-sources (создание тестового исходного кода)Создание любого тестового исходного кода, включенного в этап компиляции.
process-test-sources (обработка тестового исходного кода)Обработка тестового исходного кода, например, фильтрация случайных значений.
generate-test-resources (создание тестовых ресурсов)Создание ресурсов для тестирования.
process-test-resources (обработка тестовых ресурсов)Копирование и обработка тестовых ресурсов в целевую директорию.
test-compile (компиляция тестового исходного кода)Компиляция тестового исходного кода в тестовую целевую директорию.
process-test-classes (обработка файлов тестовых классов)Обработка файлов, сгенерированных компиляцией тестового исходного кода.
test (тест)Использование подходящего фреймворка для выполнения тестов (Juint - один из них).
prepare-package (подготовка к打包)Выполнить любые необходимые действия для подготовки к打包 перед фактическим打包ом.
package (пакетирование)Пакетировать скомпилированный код в файлы分发ного формата, такие как JAR, WAR или EAR.
pre-integration-test (до интеграционных тестов)Выполнить необходимые действия перед выполнением интеграционных тестов. Например, создать необходимые environnement.
integration-test (интеграционные тесты)Обработать и деплой проекта в среду, в которой можно выполнить интеграционные тесты.
post-integration-test (после интеграционных тестов)Выполнить необходимые действия после выполнения интеграционных тестов. Например, очистить среду интеграционных тестов.
verify (верификация)Запустить любые проверки для проверки того, что проектный пакет действителен и соответствует стандартам качества.
install (установка)Установить проектный пакет в локальное хранилище, чтобы проектный пакет можно было использовать в качестве зависимости для других локальных проектов.
deploy (деплой)Копировать конечный проектный пакет в удаленное хранилище для共享 с другими разработчиками и проектами.

Есть несколько важных концепций, связанных с жизненным циклом Maven, которые необходимо объяснить:

Когда этап вызывается командой Maven, например mvn compile, выполняются все этапы до этого этапа, включая сам этап.

Разные цели Maven будут привязаны к различным этапам жизни Maven в зависимости от типа упаковки (JAR / WAR / EAR).

В следующем примере мы добавляем цель maven-antrun-plugin:run в часть этапа жизни Build. Таким образом, мы можем отображать текстовую информацию о жизни.

Мы обновили файл pom.xml в директории C:\MVN\project.

<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.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
   <execution>
      <id>id.validate</id>
      <phase>validate</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>validate phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.compile</id>
      <phase>compile</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>compile phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.test</id>
      <phase>test</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>test phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
         <id>id.package</id>
         <phase>package</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
         <tasks>
            <echo>package phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.deploy</id>
      <phase>deploy</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
      <tasks>
         <echo>deploy phase</echo>
      </tasks>
      </configuration>
   </execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Теперь откройте консоль команд, перейдите в каталог, где находится pom.xml, и выполните следующую команду mvn.

C:\MVN\project>mvn compile

Maven начнет обрабатывать и отображать все этапы жизненного цикла сборки до этапа компиляции.

[INFO] Поиск проектов...
[INFO] ------------------------------------------------------------------
[INFO] Сборка Безымянного - com.companyname.projectgroup:project:jar:1.0
[INFO]    task-segment: [compile]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.validate}]
[INFO] Executing tasks
     [echo] validate phase
[INFO] Executed tasks
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
иначе говоря, сборка зависит от платформы!
[INFO] skip non existing resourceDirectory C:\MVN\project\src\main\resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [antrun:run {execution: id.compile}]
[INFO] Executing tasks
     [echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Sat Jul 07 20:18:25 IST 2012
[INFO] Final Memory: 7M/64M
[INFO] ------------------------------------------------------------------

Вызов из командной строки

В среде разработки используйте следующую команду для сборки и установки проекта в локальное хранилище.

mvn install

Эта команда выполняет по порядку фазы жизненного цикла default (validate, compile, package и т.д.) перед выполнением этапа install, нам нужно вызвать только последнюю фазу, например, здесь это install.

В среде сборки используйте следующее вызов для чистого 构建 и развертывания проекта в общую репозиторию.

mvn clean deploy

Эта команда также может быть использована в случае множественных модулей, то есть в проекте, включающем несколько подпроектов, Maven выполняет команду clean для каждого подпроекта, а затем команду deploy.

Жизненный цикл Site

Модуль Maven Site, как правило, используется для создания новых отчетных документов, развертывания сайтов и т.д.

  • pre-site: выполнять работы, которые необходимо выполнить до генерации документов сайта

  • site: генерировать документацию сайта проекта

  • post-site: выполнять работы, которые необходимо выполнить после генерации документов сайта, и готовиться к развертыванию

  • site-deploy:部署生成的站点文档到特定的 серверу

Часто используется этап site и этап site-deploy, чтобы генерировать и публиковать сайт Maven, что является довольно сильной функцией Maven, которую предпочитает Manager, автоматическое создание документации и статистики, выглядит очень хорошо. В следующем примере мы добавим цель maven-antrun-plugin:run во все этапы жизни Site. Таким образом, мы сможем отобразить все текстовые сообщения жизненного цикла.

Мы обновили файл pom.xml в директории C:\MVN\project.

<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.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
   <executions>
      <execution>
         <id>id.pre-site</id>
         <phase>pre-site</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>pre-site phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.site</id>
         <phase>site</phase>
         <goals>
         <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>фаза site</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.post-site</id>
         <phase>post-site</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>фаза post-site</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.deploy-site</id>
         <phase>deploy-site</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>фаза deploy-site</echo>
            </tasks>
         </configuration>
      </execution>
   </executions>
</plugin>
</plugins>
</build>
</project>

Теперь откройте консоль команд, перейдите в каталог, где находится pom.xml, и выполните следующую команду mvn.

C:\MVN\project>mvn site

Maven начнёт обработку и покажет все этапы жизненного цикла site, до этапа site.

[INFO] Поиск проектов...
[INFO] ------------------------------------------------------------------
[INFO] Сборка Безымянного - com.companyname.projectgroup:project:jar:1.0
[INFO]    участок задач: [site]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-site}]
[INFO] Executing tasks
     [echo] предварительная фаза site
[INFO] Executed tasks
[INFO] [site:site {execution: default-site}]
[INFO] Генерация отчёта "О нас".
[INFO] Генерация отчёта "Issue Tracking".
[INFO] Генерация отчёта "Project Team".
[INFO] Генерация отчёта "Зависимости".
[INFO] Генерация отчёта "Project Plugins".
[INFO] Generating "Continuous Integration" report.
[INFO] Generating "Source Repository" report.
[INFO] Generating "Project License" report.
[INFO] Generating "Mailing Lists" report.
[INFO] Generating "Plugin Management" report.
[INFO] Generating "Project Summary" report.
[INFO] [antrun:run {execution: id.site}]
[INFO] Executing tasks
     [echo] site phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sat Jul 07 15:25:10 IST 2012
[INFO] Final Memory: 24M/149M
[INFO] ------------------------------------------------------------------```