Солянка гайдов по Maven

Apache Maven

Apache Maven — фреймворк для автоматизации сборки проектов, специфицированных на XML-языке POM(англ. Project Object Model). https://ru.wikipedia.org/wiki/Apache_Maven

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

Пример файла pom.xml

<project>
  <!-- версия модели для POM-ов Maven 2.x всегда 4.0.0 -->
  <modelVersion>4.0.0</modelVersion>
 
  <!-- координаты проекта, то есть набор значений, который
       позволяет однозначно идентифицировать этот проект -->
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>
 
  <!-- зависимости от библиотек --> 
  <dependencies>
    <dependency>
 
      <!-- координаты необходимой библиотеки -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <!-- эта библиотека используется только для запуска и компилирования тестов -->
      <scope>test</scope>
 
    </dependency>
  </dependencies>
</project>

1. Установка

1.1. Windows

Для установки под Windows необходимо выполнить следующие действия:

  1. Зайдите на официальный сайт Maven http://maven.apache.org/ в раздел загрузка и скачайте последнюю стабильную версию
  2. Распакуйте архив в инсталляционную директорию. Например в «C:\Program Files\Maven\» в Windows
  3. Установите переменную окружения M2_HOME, в Windows кликните правой кнопкой мыши на «мой компьютер» ->свойства->дополнительные параметры->переменные среды->системные переменные и там добавьте «M2_HOME» и «C:\Program Files\Maven\»
  4. Установите переменную окружения PATH В Windows в переменной PATH добавьте к списку директорий строку %M2_HOME%\bin»

1.2. Ubuntu

Для установки под Ubuntu достаточно выполнить следующую команду:

sudo apt-get install maven

1.3. Проверка установки

Для проверки корректности установки, набираем в консоле следующую команду:

mvn -version

У меня вывело следующее:

Apache Maven 3.0.5
Maven home: /usr/share/maven
Java version: 1.7.0_72, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-oracle/jre
Default locale: ru_UA, platform encoding: UTF-8
OS name: "linux", version: "3.16.0-24-generic", arch: "amd64", family: "unix"

2. Терминология

Вся структура проекта описывается в файле pom.xml (POM – Project Object Model), который должен находиться в корневой папке проекта.

Ключевым понятием Maven является артефакт — это, по сути, любая библиотека, хранящаяся в репозитории. Это может быть какая-то зависимость или плагин.

Зависимости — это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования.

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

В самом начале работы с Maven, пользователь непременно столкнется с таким понятием как архетип. Архетип — это некая стандартная компоновка файлов и каталогов в проектах различного рода (веб, swing-проекты и прочие). Другими словами, Maven знает, как обычно строятся проекты и в соответствии с архетипом создает структуру каталогов.

Как правило, название артефакта состоит из названия группы, собственного названия и версии. К примеру Spring будет иметь вот такое название в среде Maven: org.springframework.spring:2.5.5. Последний домен означает всегда artifactId, все, что перед ним – groupId.

3. Стандартная структура директорий проекта Maven

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

Структура каталогов выглядит следующим образом:

src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/config Configuration files
src/main/scripts Application/Library scripts
src/main/webapp Web application sources
src/test/java Test sources
src/test/resources Test resources
src/test/filters Test resource filter files
src/it Integration Tests (primarily for plugins)
src/assembly Assembly descriptors
src/site Site
LICENSE.txt Project’s license
NOTICE.txt Notices and attributions required by libraries that the project depends on
README.txt Project’s readme

Более подробно можно прочитать на официальном сайте: http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

4. Жизненный цикл у Maven

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

При этом все шаги последовательны. И если, к примеру, выполнить mvn package, то фактически будут выполнены шаги: validate, compile, test и package. Таким образом использовать мавен довольно просто. Написали код, выполнили mvn test и можно работать дальше, убедившись что код не содержит синтаксических и логических ошибок.

5. Подключение зависимостей

Maven конфигурируется файлом pom.xml, который может содержать блок зависимостей. В этом блоке описывается какие библиотеки нужны проекту для полноценного функционирования. На шаге validate мавен проверяет удовлетворены ли зависимости и если нет, то скачивает из удаленных репозиториев необходимые компоненты в репозиторий локальный. Так, если 10 проектов зависят от одной и той же библиотеки SomeSpecificOrm, то нам больше не надо подключать ее в 10 местах через svn:external, особенно, если библиотека занимает достаточно места, а достаточно указать ее в файле зависимостей и она будет браться из локального репозитория мавена. При указании зависимостей можно указывать не только имя библиотеки, но и ее версию — таким образом не возникнет проблем с обратной совместимостью.

5.1. Использование центрального репозитория

Как правило, большинство популярных библиотек находятся в центральном репозитории. Искать эти библиотеки можно через сайт http://search.maven.org/ или тут http://mvnrepository.com/

Библиотеки которые находятся в центральном репозитории можно прописывать сразу в раздел dependencies вашего pom-файла. Например чтобы подключить Spring Framework необходимо определить следующую зависимость:

<dependencies>
	...
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring</artifactId>
		<version>2.5.5</version>
	</dependency>
	...
</dependencies>

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

5.2. Использование сторонних репозиториев

Специфические вещи обычно не находятся в центральном репозитории и тогда вам придется указать репозиторий производителя вручную. Для примера добавим зависимость JSF-фреймворка ajax-компонентов JBoss RichFaces.

Для этого нужно сделать две вещи:

  1. Указать адрес стороннего репозитория
  2. Прописать стандартным методом зависимость в pom файл проекта

Для добавления репозитория JBoss необходимо прописать ручками либо в файле settings.xml, который лежит в корне вашего локального репозитория, либо в самом файле pom.xml, в зависимости от того, нужен ли данный репозиторий во всех проектах, либо в каком-то одном конкретном, соответственно:

<!-- JBoss RichFaces Repository -->
<repositories>
	<repository>
		<id>repository.jboss.com</id>
		<name>Jboss Repository for Maven</name>
		<url>http://repository.jboss.com/maven2/</url>
		<layout>default</layout>
		<releases>
			<enabled>true</enabled>
		</releases>
		<snapshots>
			<enabled>false</enabled>
			<updatePolicy>never</updatePolicy>
		</snapshots>		
	</repository>
</repositories>

После этого можно как обычно добавить зависимость в проект:

<dependencies>
	<dependency>
		<groupId>org.richfaces.ui</groupId>
		<artifactId>richfaces-ui</artifactId>
		<version>3.3.1.GA</version>
	</dependency>        
</dependencies>

5.3. Подключение сторонних зависимостей

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

mvn install:install-file
     -Dfile=<path-to-file>
     -DgroupId=<group-id>
     -DartifactId=<artifact-id>
     -Dversion=<version>
     -Dpackaging=<packaging>

В этом случае указаный файл буде добавлен в локальный репозиторий.

5.4. Автоматизация подключения сторонних зависимостей

Бывает так, что в зависимости необходимо модифицировать исходники, и затем использовать в проекте. Для решения этой проблемы на сайте https://devcenter.heroku.com/articles/local-maven-dependencies предлагают следующий способ, как мне кажется очень корректный:

Первое, что мы делаем — это создаём папку «repo» в своём проекте:

yourproject
+- pom.xml
+- src
+- repo

Затем, деплоим туда наш jar файл:

mvn deploy:deploy-file -Durl=file:///path/to/yourproject/repo/ -Dfile=mylib-1.0.jar -DgroupId=com.example -DartifactId=mylib -Dpackaging=jar -Dversion=1.0

В результате этого получаем, следующее:

yourproject
+- pom.xml
+- src
+- repo
   +- com
      +- example
         +- mylib
            +- maven-metadata.xml
            +- ...
            +- 1.0
               +- mylib-1.0.jar
               +- mylib-1.0.pom
               +- ...

Затем добавляем в pom наш репозиторий проекта:

<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>

После чего, добавляем нашу зависимость обычным способом:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>
</dependency>

6. Сборка

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

mvn [этапы жизненного цикла] [дополнительные параметры]

Так для банальной сборки проекта достаточно выполнить следующую команду:

mvn clean install

Для выполнения сборки без запуска тестов выполняется следующая команда:

mvn clean install -DskipTests

Полезные ссылки

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s