Maven в вопросах и ответах

На странице рассмотрены следующие вопросы использования фреймворка Maven :

  1. Команда создания нового проекта
  2. Структура файла описания проекта pom.xml
  3. GAV-параметры и полное наименование артифакта
  4. Назначение SNAPSHOT
  5. Область действия зависимости scope
  6. Использование внешних зависимостей
  7. Транзитивные зависимости
  8. Maven плагины
  9. Порядок выполнения maven команды
  10. Тестирование maven проекта
  11. Maven репозитории
  12. Предопределёные переменные в файле 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> при сложных связях (см. dependencyManagement).

Подробнее


Использование внешних зависимостей

В качестве внешних зависимостей, как правило, используются собственные разработки, не размещаемые в центральном и локальном репозиториях. Внешние зависимости определяются в файле pom.xml также, как и другие зависимости – необходимо определить параметры GAV (groupId, artifactId, version) и область видимости scope как system. В теге <systemPath> необходимо указать абсолютный путь к файлу.

<dependencies>
    <dependency>
        <groupId>ru.carousel</groupId>
        <artifactId>carousel-lib</artifactId>
        <version>1.0.0</version>
        <scope>system</scope>
        <systemPath>
               d:/projects/libs/carousel-lib.jar
        </systemPath>
    </dependency>
</dependencies>


Транзитивные зависимости

Транзитивные зависимости позволяют избегать необходимости дополнительного указания в секции dependencies библиотек, которые требуются для самой зависимости, и maven включает их в проект автоматически. При разрешении конфликта версий используется принцип «ближайшей» зависимости, то есть выбирается зависимость, путь к которой через список зависимых проектов является наиболее коротким.

Команды «mvn depenency:list» и «mvn dependency:tree» позволяют вывести в консоль зависимости в виде списка или дерева соответственно.

Подробнее


Maven плагины

Maven использует два типа плагинов :

  • плагины сборки (build plugins) - определяются в секции <build></build> файла pom.xml и выполняются в процессе сборки;
  • плагины отчётов (reporting plugins) - определяются в секции <reporting></reporting> файла 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. Для этого можно использовать тег <skipTests> или <maven.test.skip>. Например :

<properties>
    <maven.test.skip>true</maven.test.skip>
</properties>

Примечание : помните, что запретив выполнение тестов в файле pom.xml, нельзя будет выполнять тесты с помощью Maven.


Maven репозитории

Под репозиторием (repository) понимается, как правило, внешние центральные хранилища артефактов, в которых собрано огромное количество наиболее популярных и востребованных библиотек, и локальное хранилище (${user.home}\.m2\repository), в котором хранятся копии используемых ранее библиотек. Кроме этого, можно создать репозиторий в самом maven-проекте.

Используемые в проекте внешние репозитории описываются в секции <repositories> :

<repositories>
    <repository>
        <id>repo1.maven.org</id>
        <url>http://repo1.maven.org/maven2</url>
    </repository>
</repositories>

Подробнее


Предопределёные переменные в файле pom.xml

При описании проекта в файле pom.xml можно использовать переменные, на которые можно сослаться с помощью префиксов "project." или "pom." Наиболее часто используемые элементы :

  • ${project.build.directory} - "target" директория, или тоже самое ${pom.project.build.directory};
  • ${project.build.outputDirectory} - путь к директории куда компилятор складывает файлы по умолчанию "target/classes";
  • ${project.name} - наименование проекта;
  • ${project.version} - версия проекта.

Подробнее

  Рейтинг@Mail.ru