На странице рассмотрены следующие вопросы использования фреймворка Maven :
Команда создания нового проекта
Структура файла описания проекта pom.xml
GAV-параметры и полное наименование артефакта
Назначение SNAPSHOT
Область действия зависимости scope
Использование внешних зависимостей
Транзитивные зависимости
Maven плагины
Порядок выполнения maven команды
Тестирование maven проекта
Maven репозитории
Предопределёные переменные в файле pom.xml
Команда создания нового проекта
Для создания нового проекта используется плагин archetype с целью (goal) generate. В команде необходимо указать параметры GAV (groupId, artifactId, version) и тип артефакта archetypeArtifactId. Количество разнотипных артефактов у фреймворка maven огромно. Пример копирования наименований архитипов в файл и создания простого maven-проекта :
1. Копирование наименований архитипов в файл mvn archetype:generate > archetypes.txt 2. Создание простого maven проекта mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=framework-factory \ -Dversion=1.0.0 \ -DarchetypeArtifactId=maven-archetype-quickstart
Структура файла описания проекта pom.xml
При описании проекта в файле pom.xml используются следующие теги и секции :
project
элемент верхнего уровня, описание проекта;
GAV-параметры
параметры проекта;
url
интернет-страница проекта;
properties
секция свойств проекта;
repositories
секция репозиториев;
dependencies
секция определения зависимостей проекта;
build
описание сборки проекта
Не все секции файла описания проекта pom.xml являются обязательными.
GAV-параметры и полное наименование артефакта
Параметры артефакта GAV включают groupId, artifactId, version. Полное имя артефакта (координата) представляет четыре слова, разделенные знаком двоеточия в следующем порядке groupId:artifactId:packaging:version.
Назначение SNAPSHOT
SNAPSHOT используется в определении версии артефакта и обозначает незавершенность её разработки. При каждой сборке проекта maven проверяет наличие обновленной версии snapshot артефакта в удалённом репозитории и подгружает последний.
Область действия зависимости scope
Область действия зависимости scope определяет этап жизненного цикла проекта, в котором эта зависимость будет использоваться. Maven использует 6 областей :
compile — область по умолчанию, использутся, если scope не определена. Compile зависимости доступны во всех classpath проекта;
provided — очень похоже на compile, но эта зависимость в сборку не попадает. Предполагается, что зависимость (артефакт) уже присутствует в JDK или в WEB-контейнере. Эта область доступна только на этапах компиляции и тестирования и не является транзитивной;
runtime — зависимость с данной областью видимости не обязательна для compilation и используется в фазе выполнения;
test — зависимость используется при тестировании кода приложения;
system — область похожа на provided за исключением того, что необходимо определить физическое расположение артефакта на диске. Артефакт с этой областью видимости maven не ищет в репозитории;
import — эта область используется в зависимости секции при сложных связях (см. dependencyManagement).
Использование внешних зависимостей
В качестве внешних зависимостей, как правило, используются собственные разработки, не размещаемые в центральном и локальном репозиториях. Внешние зависимости определяются в файле pom.xml также, как и другие зависимости – необходимо определить параметры GAV (groupId, artifactId, version) и область видимости scope как system. В теге необходимо указать абсолютный путь к файлу.
Транзитивные зависимости позволяют избегать необходимости дополнительного указания в секции dependencies библиотек, которые требуются для самой зависимости, и maven включает их в проект автоматически. При разрешении конфликта версий используется принцип «ближайшей» зависимости, то есть выбирается зависимость, путь к которой через список зависимых проектов является наиболее коротким.
Команды «mvn depenency:list» и «mvn dependency:tree» позволяют вывести в консоль зависимости в виде списка или дерева соответственно.
Maven плагины
Maven использует два типа плагинов :
плагины сборки (build plugins) — определяются в секции файла pom.xml и выполняются в процессе сборки;
плагины отчётов (reporting plugins) — определяются в секции файла pom.xml и выполняются в процесса генерирования сайта.
Плагины используются для :
сборки проекта – cоздание файлов jar, war, ear;
компиляции исходных кодов проекта (java файлов);
тестирования модулей проекта – запуск JUnit тестов;
формирования отчётов проекта;
создания документации проекта.
Порядок выполнения maven команды
Как будет выполнена следующая команда
mvn clean dependency:copy-dependencies package
Аргументы clean и package являются фазами сборки проекта, «dependency:copy-dependencies» представляет собой задачу, которую выполняет плагин dependency для цели copy-dependencies (копирование зависимостей проекта в поддиректорию target/dependency).
Maven сначала выполнит фазу очистки clean, после этого будут скопированы зависимости «dependency:copy-dependencies», и в завершении выполнится сборка проекта.
Тестирование проекта
Для выполнения JUnit тестов проекта необходимо выполнить команду «mvn test». Чтобы выполнить определенный тест необходимо в командной строке указать полный путь [-Dtest=package.test-class] к конкретному тесту, например :
mvn test -Dtest=com.example.TestConnection
Для запуска сборки проекта с предварительной очисткой поддиректории «target» без выполнения тестов используйте следующую команду :
mvn clean package -Dmaven.test.skip=true
Выполнение тестов можно запретить в секции «properties» файла pom.xml. Для этого можно использовать тег или . Например :
true
Примечание : помните, что запретив выполнение тестов в файле pom.xml, нельзя будет выполнять тесты с помощью Maven.
Maven репозитории
Под репозиторием (repository) понимается, как правило, внешние центральные хранилища артефактов, в которых собрано огромное количество наиболее популярных и востребованных библиотек, и локальное хранилище ($\.m2\repository), в котором хранятся копии используемых ранее библиотек. Кроме этого, можно создать репозиторий в самом maven-проекте.
Используемые в проекте внешние репозитории описываются в секции :
repo1.maven.orghttp://repo1.maven.org/maven2
Предопределёные переменные в файле pom.xml
При описании проекта в файле pom.xml можно использовать переменные, на которые можно сослаться с помощью префиксов «project.» или «pom.» Наиболее часто используемые элементы :
$ — «target» директория, или тоже самое $ ;
$ — путь к директории куда компилятор складывает файлы по умолчанию «target/classes»;
$ — наименование проекта;
$ — версия проекта.
Maven – Плагины
Maven на самом деле является структурой исполнения плагинов, где каждая задача фактически выполняется с помощью плагинов. Плагины Maven обычно используются для:
создать файл jar
создать файл войны
компилировать файлы кода
модульное тестирование кода
создать проектную документацию
создавать отчеты проекта
Плагин, как правило, предоставляет набор целей, которые могут быть выполнены с использованием следующего синтаксиса –
mvn [plugin-name]:[goal-name]
Например, проект Java может быть скомпилирован с целью компиляции maven-compiler-plugin путем выполнения следующей команды.
mvn compiler:compile
Типы плагинов
Maven предоставил следующие два типа плагинов –
Сборка плагинов
Они выполняются во время процесса сборки и должны быть настроены в элементе файла pom.xml.
Плагины отчетности
Они выполняются во время процесса создания сайта и должны быть настроены в элементе файла pom.xml.
Сборка плагинов
Они выполняются во время процесса сборки и должны быть настроены в элементе файла pom.xml.
Плагины отчетности
Они выполняются во время процесса создания сайта и должны быть настроены в элементе файла pom.xml.
Ниже приведен список нескольких распространенных плагинов –
Очищает цель после сборки. Удаляет целевой каталог.
Запускает набор задач ant на любом этапе, упомянутом в сборке.
В наших примерах мы широко использовали maven-antrun-plugin для печати данных на консоли. См. Главу «Создание профилей». Давайте лучше разберемся в этом и создадим pom.xml в папке C: \ MVN \ project.
В данном примере вызывается плагин с groupId"org.apache.maven.plugins",artifactId "maven-checkstyle-plugin", последней версией и целью (goal) "check".
Цель - это действие, которое плагин может выполнить. Целей может быть несколько.
2. Объявление плагина в pom.xml
Объявление плагина похоже на объявление зависимости. Так же, как и зависимости плагины идентифицируется с помощью GAV (groupId, artifactId, version). Объявление плагина в pom.xml позволяет зафиксировать версию плагина, задать ему необходимые параметры, привязать к фазам.
После того как плагин объявлен, его можно настроить так, чтобы он автоматически запускался в нужный момент. Это делается с помощью привязки плагина к фазе сборки проекта. В данном примере плагин запустится в фазе проекта package:
Плагин maven-archetype-plugin предназначен для того чтобы по существующему шаблону создавать новые проекты. Создать проект с помощью maven-archetype-plugin достаточно просто - достаточно набрать:
mvn archetype:generate
Дальше выбрать шаблон из списка, ответить на дополнительные вопросы - и плагин сгенерирует проект.
3.2. Плагин maven-compiler-plugin
Компилятор - основной плагин который используется практически во всех проектах. Он доступен по умолчанию, но текущая версия Java 5.
В следующем примере в конфигурации используется версия java 1.9 (source - версия языка, на котором написана программа. А target - версия Java машины которая будет этот код запускать). И указано, что кодировка исходного кода программы UTF-8.
Пример 3. Использование плагина maven-compiler-plugin
Плагин maven-javadoc-plugin предназначен для того, чтобы генерировать документацию по исходному коду проекта стандартной утилитой javadoc.
Запускается с помощью команды:
mvn javadoc:javadoc
Документация генерируется в target/site/apidocs каталог текущего проекта.
3.4. Плагин maven-checkstyle-plugin
Плагин проверяет стиль и качество исходного кода и генерирует файл checkstyle-result.xml. Из наиболее часто используемых и простых проверок:
наличие комментариев;
размер класса не более N строк;
в конструкции в try-catch, блок catch не пуст.
Запуск с помощью команды:
mvn checkstyle:check
Т.к. почти каждые проекты пишутся немного по-разному, рекомендуется создать свой набор правил. Или подавить проверку некоторых правил. Для этого используется файл suppressions.xml.
Пример 4. Использование плагина maven-checkstyle-plugin
maven-pmd-plugin - плагин для автоматического анализа кода на предмет наличия "нехорошего кода". Также в этом плагине есть цель которая находит дубликаты кода Copy/Paste Detector (CPD).
Существует два режима работы плагина:
Генерирование отчётов PMD и CPD:
mvn pmd:pmd mvn pmd:cpd
mvn pmd:check mvn pmd:cpd-check
3.6. Плагин findbugs-maven-plugin
findbugs-maven-plugin плагин для автоматического нахождения багов в проекте. Принцип действия плагина основан на поиске шаблонов ошибок. Код проекта проверяются на часто встречаемые ошибки, неправильное использование API и конструкций языка.
Запускаем с помощью
mvn findbugs:check
Пример 6. Использование плагина findbugs-maven-plugin
org.codehaus.mojofindbugs-maven-plugin3.0.4true
Файл pom.xml
Информация для программного проекта, поддерживаемого Maven, содержится в XML-файле с именем pom.xml (от Project Object Model). При исполнении Мавен проверяет прежде всего, содержит ли этот файл все необходимые данные и все ли данные синтаксически правильно записаны.
Корневой элемент , в котором прописана схема облегчающая редактирование и проверку, и версия POM.
Пример 2. Корневой элемент
2. Заголовок
Внутри тега project содержится основная и обязательная информация о проекте:
Пример 3. Заголовок
com.examcloudscourses1.0-SNAPSHOT
В Maven каждый проект идентифицируется парой groupId,artifactId.
Во избежание конфликта имён, groupId - наименование организации или подразделения и обычно действуют такие же правила, как и при именовании пакетов в Java - записывают доменное имя организации или сайта проекта.
artifactId - название проекта.
Внутри тега version хранится версия проекта.
Тройкой groupId, artifactId, version (далее - GAV) можно однозначно идентифицировать jar файл приложения или библиотеки. Если состояние кода для проекта не зафиксировано, то в конце к имени версии добавляется "-SNAPSHOT" что обозначает, что версия в разработке и результирующий jar файл может меняться.
3. Тег packaging
Тег определяет какого типа файл будет создаваться как результат сборки. Возможные варианты pom, jar, war, ear.
Тег является необязательным. Если его нет, используется значение по умолчанию - jar.
4. Описание проекта
Также добавляется информация, которая не используется самим Maven, но нужна для программиста, чтобы понять, о чём этот проект:
Пример 4. Описание проекта
powermock-core название проекта для человека PowerMock core functionality. Описание проекта http://www.powermock.org сайт проекта
5. Зависимости
Зависимости - следующая очень важная часть pom.xml - тут хранится список всех библиотек (зависимостей) которые используются в проекте. Каждая библиотека идентифицируется так же как и сам проект - тройкой groupId, artifactId, version (GAV). Объявление зависимостей заключено в теге ..
Кроме GAV при описании зависимости может присутствовать тег . Он задаёт, для чего библиотека используется. В данном примере говорится, что библиотека с GAV junit:junit:4.4 нужна только для выполнения тестов.
- определяет, откуда Maven будет брать файлы исходного кода. По умолчанию это src/main/java, но вы можете определить, где это вам удобно. Директория может быть только одна (без использования специальных плагинов).
и вложенные в неё теги определяют, одну или несколько директорий, где хранятся файлы ресурсов. Ресурсы в отличие от файлов исходного кода при сборке просто копируются. Директория по умолчанию src/main/resources.
- определяет, в какую директорию компилятор будет сохранять результаты компиляции - *.class файлы. Значение по умолчанию - target/classes.
- имя результирующего jar (war, ear . ) файла с соответствующим типу расширением, который создаётся на фазе package. Значение по умолчанию — artifactId-version.
Maven плагины позволяют задать дополнительные действия, которые будут выполняться при сборке. Например, в приведённом примере добавлен плагин, который автоматически делает проверку кода на наличие "плохого" кода и потенциальных ошибок.