Архив рубрики: Java

Использование системы Maven — управление Java-проектом

Автор документа: Князев Алексей
Адрес: Россия, Саратов
email: knzsoft@mail.ru
skype: knzsoft (украден с 2013-12-12)
Google hangouts: knzsoft@gmail.com
тел. (Мегафон): +7-927-220-35-67

Последняя дата изменения документа: 2013-07-08

Оглавление

Введение

Maven представляет собой межплатформенную систему сборки и управления проектами на языке Java. В отличии от императивного характера альтернативной системы Ant, Maven отличается декларативным подходом к описанию проекта. Декларативность означает, что в проектном файле Maven не описывается необходимая последовательность действий по выполнению той или иной цели. Вместо этого, кроме необходимых данных по идентификации данного проекта в системе репозиториев Maven, описываются необходимые зависимости от библиотек и других модулей проекта, а также указания на использование тех или иных плагинов,
влияющих на исполнение целей.

Декларативность и принятая структура описаний позволяет Maven быть по настоящему межплатформенной. Нигде не пишутся конкретные зависимости от конкретного расположения объектов в файловой системе. Все объекты зависимостей описываются через их систему идентификации в одном из репозиториев Maven. Единственным требованием для этого является наличие такой идентификации в репозитории, и эта задача тоже с успехом решается для любых объектов.

Идентификация объектов в репозиториях Maven основывается на значении трех параметров, называемых еще GAV-идентификацией по первым буквам их названий.

  1. groupId — идентификатор производителя объекта. Часто используется схема принятая в обозначении пакетов Java. Например, если производитель имеет домен visit7.com, то в качестве значения groupId удобно использовать значение com.visit7.
  2. artifactId — идентификатор объекта. Обычно это имя создаваемого модуля или приложения.
  3. version — версия описываемого объекта. Для незавершенных проектов принято добавлять суффикс SNAPSHOT. Например 1.0-SNAPSHOT.

Таким образом, основную часть описания проекта в проектном файле pom.xml (Project Object Model) системы Maven составляет GAV-идентификация проекта. В остальном, для самых простых проектов, можно положиться на умолчания.

Система Maven может исполнять некоторый нерасширяемый набор целей на основе данных, описанных в проектном файле, в контексте той операционной системы, где работает Maven.

Основные исполняемые цели Maven (команды Maven)

Использование системы Maven часто сводится к выполнению следующего набора команд, которые можно назвать целями, по аналогии с другими системами сборки (Ant, make и пр.). В общем случае, работа с Maven может быть описана следующей командой (знак $ отображает стандартное приглашение в командной строке *nix):

$ mvn <цель>

Цель может быть одна из следующего списка.

  1. validate — проверяет корректность метаинформации о проекте
  2. compile — компилирует исходники
  3. test — прогоняет тесты классов из предыдущего шага
  4. package — упаковывает скомпилированые классы в удобноперемещаемый формат (jar или
    war, к примеру)
  5. integration-test — отправляет упакованные классы в среду интеграционного тестирования и
    прогоняет тесты
  6. verify — проверяет корректность пакета и удовлетворение требованиям качества
  7. install — загоняет пакет в локальный репозиторий, откуда он (пакет) будет доступен для
    использования как зависимость в других проектах
  8. deploy — отправляет пакет на удаленный production сервер, откуда другие разработчики
    его могут получить и использовать

Проектный файл Maven

Проектный файл Maven представляет собой файл формата XML с названием pom.xml (Project Object Model).

Поиск архетипов (archetype)

Проектный файл можно написать самому, а можно воспользоваться генерацией на основе выбора так называемого архетипа (archetype, шаблона проекта).

Познакомиться со списком архетипов для генерации проектов Maven можно на странице http://docs.codehaus.org/display/MAVENUSER/Archetypes+List. Сокращенный список наиболее популярных архетипов приложений можно найти на странице http://maven.apache.org/guides/introduction/introduction-to-archetypes.html.

Генерация простейшего проектного файла

Чтобы создать простейший проектный файл можно воспользоваться архетипом maven-archetype-quickstart. Для этого, выберите директорию для создания проекта и выполните следующую команду, определив по-своему параметры GAV-идентификации.

mvn archetype:generate 
  -DgroupId=com.visit7
  -DartifactId=test-1
  -Dversion=1.2.3
  -DarchetypeArtifactId=maven-archetype-quickstart

Команда должна быть написана в одну строчку. Здесь, она разнесена по строкам для удобства чтения.

В некоторых случаях требуется добавить опцию уточнения версии архетипа, например: -DarchetypeVersion=8.2.0.Final

Если вы укажете все эти определения (-D), то выполнение цели archetype:generate запросит вас только подтвердить введенные данные. Для подтвержения введите Y и нажмите Enter, или просто нажмите Enter.

В результате выполнения этой команды мы получим директорию с именем артефакта (test-1) внутри которой будет находится проектный файл pom.xml и начальная структура поддиректорий, характерная для проектов Maven.

Ниже приведено содержимое сгенерированного файла pom.xml.

<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>ru.knzsoft</groupId>
    <artifactId>test-1</artifactId>
    <packaging>jar</packaging>

    <version>1.2.3</version>

    <name>test-1</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

В данном проектном файле мы видим раздел описания GAV-идентификации и видим описание раздела зависимостей, в который, на начальном этапе, входит только
зависимость от библиотеки JUnit. Каждая зависимость включается внутри отдельного тега dependency.

Тег packaging указывает на результирующий тип файла, который система Maven должна создать при исполнении цели package. Допустимые значение — jar, war и ear. По-умолчанию используется значение jar.

Теги name и url не используются системой Maven и нужны для разработчиков, открывших код проектного файла. Тег name описывает
человеческое имя проекта, а тег url — сайт размещения проекта.

Теперь рассмотрим структуру поддиректорий, которая генерируется для проекта Maven.

test-1
  src
    main
      java
        <структура директорий пакетов проекта>
    test
      java
        <структура директорий пакетов unit-тестов проекта>

Обычно, структура директорий пакетов unit-тестов соответствует структуре директорий пакетов самого проекта, чтобы unit-тесты
использовали пакетную область видимости тех классов, которые они тестируют.

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

Разрешение зависимостей

Все зависимости проектного файла можно разделить на те, которые будут разрешены через специальные публичные веб-интерфейсы к центральной БД системы Maven и на те, что будут решаться через ваш локальный репозиторий. Все то, что нельзя найти в центральной системе (например, зависимости от других проектных модулей разрабатываемой вами системы) понадобится зарегистрировать в локальном репозитории с помощью команды mvn install. Как правило, в центральном репозитории Maven вы найдете все мало-мальски интересные или важные проекты из мира Java, поэтому ручная регистраци архивных файлов jar понадобится вам в очень редких случаях.

Итак, чтобы указать в зависимостях какую-либо библиотеку, необходимо знать ее GAV-идентификацию в одном из используемых репозиториев Maven. Чтобы найти groupeId, artefactId и version для зарегистрированных в проекте Maven библиотек можно воспользоваться ресурсом http://mvnrepository.com/. Зайдем, например, на данный сайт и попробуем определить GAV-идентификацию для библиотеки log4j. Введем log4j в строку поиска. В списке результатов поиска находим наиболее подходящую для нас ссылку и следуем по ней. Часто, при удачно построенном запросе, нам подойдет самая верхняя ссылка. В открывшейся далее странице выбираем требуемую нам версию библиотеки из доступных и получаем xml код для зависимости (dependency). Вам его просто надо будет добавить в файл pom.xml. Для нашего случая мы получаем следующий фрагмент кода для вставки в проектный файл.

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

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

Приведем пример такой регистрации.

mvn install:install-file 
  -Dfile=ojdbc14.jar 
  -DgroupId=com.oracle 
  -DartifactId=oracle 
  -Dversion=10.2.0.1 
  -Dpackaging=jar	
  -DgeneratePom=true

После этого, можно использовать данную зависимость в файле проекта, воспользовавшись использованной при установке в репозиторий GAV-идентификации.

Установка Maven

Чтобы установить maven в Linux, достаточно исполнить следующую команду установки.

$ sudo apt-get install maven

Под Windows установка традиционно сложнее. Понадобится найти в Интернет текущую версию продукта, скачать инсталляционный пакет, ознакомиться и выполнить правила инсталляции.

Установка плагина Maven в Eclipse

Чтобы реализовать поддержку Maven в Eclipse надо выполнить следующие шаги по установки необходимого набора плагинов.

Запустим Eclipse. В главном меню Help, выбираем подменю Install new software…

Устанавливаем поле Work with в значение — All available sites — и в поле фильтра пишем m2e. Указываем галочку напротив значения General Purpose Tools. Нажимаем кнопку Next и выполняем завершение установки.

Репозитории

Одной из отличительных черт системы Maven является работа основанная на централизации сведений об используемых артефактах. Чтобы какой-то артефакт (проект) мог
быть использован в зависимостях другого артефакта, информация о нем должна быть занесена в один из трех видов репозиториев Maven.

Различают локальные, центральный и корпоративные репозитории Maven.

Локальные репозитории создаются на компьютерах разработчиков. У каждого weразработчика, использующего Maven, в его домашней директории создается поддиректория .m2/repository которая представляет собой корневую директорию для файловой иерархии локального репозитория. Фактически, это некоторый кэш основной части центрального репозитория. В процессе работы над проектами, разработчики могут помещать в свой локальный репозиторий свои собственные артефакты для возможности
их повторного использования.

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

Корпоративный репозиторий организуется для групповой работы над проектом. Сервер, на котором располагается корпоративный репозиторий называют production-сервером.

Плагины

Плагины используются для изменения поведения Maven при выполнении стандартных целей и для расширения функциональности. Плагины описываются в файле проекта внутри следующей системы тегов.

<project>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <!-- теги описания плагина 1 -->
        </plugin>
        <plugin>
          <!-- теги описания плагина 2 -->
        </plugin>
        <plugin>
          <!-- теги описания плагина 3 -->
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Полезные плагины

Плагин указания версии компилятора Java

В данном разделе приводится пример плагина, который позволяет указать версию компилятора Java. В примере указана Java 7.

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

Плагин указания исполняемого класса в библиотеке

Если один из ваших проектов собирается в Java-архив, который вы предполагаете запускать с помощью команды java -jar <имя файла Java-архива>, то такой архив, в своем файле манифеста должен иметь указание на класс со статической функцией main() используемой для запуска Java-приложений. К сожалению, это требуется
делать, даже если Java-архив состоит всего из одного класса.

Приведенный ниже пример, включает в проектный файл плагин с указанием запускаемого класса com.visit7.test-1.MyApp.

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.visit7.test-1.MyApp</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </pluginManagement>
</build>