Professor Hans Noodles
41 уровень

Часть 4. Основы Maven

Статья из группы Random
Этот материал — часть цикла “Введение в Enterprise-разработку”. Предыдущие статьи: Часть 4. Основы Maven - 1Maven — инструмент для управления и сборки проектов — настоящий помощник Java-программиста. Он облегчает жизнь девелоперу на всех стадиях работы: от создания структуры проекта и подключения необходимых библиотек до развертывания продукта на сервере. При работе с любым фреймворком придется использовать Maven. Поэтому давай сегодня разберем его основные функции и посмотрим, как их нужно использовать.

Пошаговая установка Maven

  1. Для начала нужно установить Maven, скачав его по этой ссылке.

  2. Далее необходимо распаковать скачанный архив и установить переменной окружения M2_HOME ссылку на местонахождение распакованного архива. Например, C:\Program Files\maven\

  3. Чтобы проверить, что все установилось, в командной строке пропиши:

    mvn -version

  4. Если отобразится информация о версии Maven, Java и т.д., все готово к работе.

  5. Теперь открой IntelliJIDEA и создай новый проект. В первом же окне выбери Maven:

    Часть 4. Основы Maven - 2
  6. Нажми Next и заполни следующее диалоговое окно:

    Часть 4. Основы Maven - 3
  7. Далее стандартно создай проект в необходимом месте.

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

    Часть 4. Основы Maven - 4
Это cтандартная структура для Maven-проекта:
  • в папке src/main/java содержатся java-классы;
  • в src/main/resources — ресурсы, которые использует наше приложение (HTML-страницы, картинки, таблицы стилей и тд);
  • src/test — для тестов.
Еще обрати внимание на файл под название pom.xml. Это и есть главный файл для управления Мавеном. Все описание проекта содержится здесь. Пока там не слишком много информации, но сейчас мы будем ее добавлять.

Управление зависимостями в Maven

Возможно, ты встречал словосочетание “менеджер зависимостей” или “dependency manager”. Мавен все это умеет. Благодаря Мавену тебе не нужно тратить кучу времени на поиски нужной библиотеки в интернете, качать ее, а потом подключать к проекту: достаточно добавить необходимую в список зависимостей Мавена. Зависимости записываются в XML-ноду dependencies Скажем, тебе в проекте нужна библиотека Apache Commons IO для упрощенной работы с файлами. Чтобы добавить библиотеку, напиши пять строк в pom.xml:

<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.6</version>
</dependency>
Теперь твой pom.xml должен выглядеть так:

  <?xml version="1.0" encoding="UTF-8"?>
<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>example.com</groupId>
   <artifactId>example</artifactId>
   <version>1.0-SNAPSHOT</version>

   <dependencies>
       <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.6</version>
       </dependency>
   </dependencies>
</project>
После этого разреши IntelliJ IDEA импортировать зависимость (диалоговое окно должно появиться в правом нижнем углу). Теперь библиотека готова к использованию:

import org.apache.commons.io.FileUtils;

import java.io.File;

public class TestMaven {
   public static void main(String[] args) {
       File tempDirectory = FileUtils.getTempDirectory();
   }
}
Все последующие зависимости тоже должны записываться внутри тега <dependencies>. У тебя может возникнуть вопрос: как узнать информацию, которую нужно указывать о библиотеке внутри тега <dependency>? Тут все просто. В таких случаях всегда задаются три параметра: groupId, artifactId и version. Узнать эти параметры можно двумя способами:
  1. На сайте библиотеки. Если нам нужен Apache Commons IO, переходим на официальный сайт, выбираем вкладку Dependency Information. Здесь есть вся необходимая информация — ее можно просто скопировать и добавить в наш раздел dependencies.

  2. В Maven-репозитории. В поиске введи “apache commons io”, и ты увидишь все доступные версии библиотеки. После выбора нужной, просто скопируй:

    
    <dependency>
               <groupId>commons-io</groupId>
               <artifactId>commons-io</artifactId>
               <version>2.6</version>
           </dependency>
    

    и добавь в свой pom.xml.

Виды Maven-репозиториев

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

Сборка Java-проекта с помощью Maven

Возможно, новичку эта возможность покажется бессмысленной. Зачем это нужно, если есть IDE? Но нет! Во-первых, на сервере, на котором придется собирать приложение, может не быть не то что среды разработки, но и графического интерфейса. Во-вторых, на больших проектах Мавен лучше справляется с задачами по сборке проекта. Поэтому не будем томить себя ожиданием, а рассмотрим процесс сборки приложения с использованием Maven.

Фазы

Процесс построения приложения называют жизненным циклом Maven-проекта, и состоит он из фаз (phase). Посмотреть на них ты можешь в IDEA, нажав на Maven>example>Lifecycle в правом верхнем углу: Часть 4. Основы Maven - 5Как видишь, существует 9 фаз:
  1. clean — удаляются все скомпилированные файлы из каталога target (место, в котором сохраняются готовые артефакты);
  2. validate — идет проверка, вся ли информация доступна для сборки проекта;
  3. compile — компилируются файлы с исходным кодом;
  4. test — запускаются тесты;
  5. package — упаковываются скомпилированные файлы (в jar, war и т.д. архив);
  6. verify — выполняются проверки для подтверждения готовности упакованного файла;
  7. install — пакет помещается в локальный репозиторий. Теперь он может использоваться другими проектами как внешняя библиотека;
  8. site — создается документация проекта;
  9. deploy — собранный архив копируется в удаленный репозиторий.
Все фазы выполняются последовательно: нельзя запустить, скажем, четвертую фазы, пока не завершены фазы 1-3. Выполнить запуск фазы можно двумя способами:
  • через командную строку:

    mvn package

    Часть 4. Основы Maven - 6
  • используя Intellij IDEA:

    Часть 4. Основы Maven - 7

    До запуска package выполняются фазы validate, compile, test. Исключение — фаза clean. Ее желательно вызывать перед каждой новой сборкой проекта. Фазы можно перечислить через пробел:

    mvn clean package.

Также у каждой фазы есть пре- и пост-фазы: например, pre-deploy, post-deploy, pre-clean, post-clean, но используются они довольно редко. Кроме этого, у каждой фазы есть цели (goal). Стандартные цели заложены по умолчанию, дополнительные добавляются Maven-плагинами. Иногда во время какой-то фазы нужно выполнить дополнительный функционал. Для этого существуют Maven-плагины. Список официальных плагинов можно посмотреть на сайте Мавена. Но знай, что еще есть много пользовательских плагинов, которые можно найти на сторонних ресурсах. Ну и естественно, при какой-то экзотической необходимости, у тебя всегда остается возможность написать такой плагин самому. Часть 4. Основы Maven - 8

Плагины

Чтобы добавить Мавен-плагин в проект, его описание, аналогично зависимостям, нужно поместить в pom.xml в тег <build> и <plugins>. Например, нам нужен плагин для проверки того, что все наши внешние библиотеки используют самые последнии версии. Немного поискав интернете, можно найти этот плагин с инструкцией использования. Установим его groupId, artifactId и version. Пропишем, какие цели он должен выполнить и на какой фазе. В нашем случае проверка зависимостей в текущем pom.xml установлена на фазе validate. Теперь наш “помник” выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<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>example.com</groupId>
   <artifactId>example</artifactId>
   <version>1.0-SNAPSHOT</version>

   <build>
       <plugins>
           <plugin>
               <groupId>com.soebes.maven.plugins</groupId>
               <artifactId>uptodate-maven-plugin</artifactId>
               <version>0.2.0</version>
               <executions>
                   <execution>
                       <goals>
                           <goal>dependency</goal>
                       </goals>
                       <phase>validate</phase>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>

   <dependencies>
       <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.6</version>
       </dependency>
   </dependencies>
</project>
Мы все так же можем продолжать работу над нашим проектом. Но давай попробуем поменять версию Apache Commons IO на 2.0 и запустить сборку проекта. Получим: [ERROR] Failed to execute goal com.soebes.maven.plugins:uptodate-maven-plugin:0.2.0:dependency (default) on project example: There is a more up-to-date version ( 2.6 ) of the dependency commons-io:commons-io:2.0 available. -> [Help 1] Здесь у нас ошибка сборки, вызванная плагином. В сообщении к ошибке указано, что мы используем 2.0 версию при наличии 2.6. Вообще, Мавен очень полезный инструмент. Возможно, поначалу он покажется трудным в использовании, но практикуйся, создавай свои проекты под управлением Мавена, и через некоторое время ты будешь очень доволен результатом. В этой статье нарочно упущено много деталей о Мавене — мы сконцентрировались на самом необходимом. Но совершенству нет предела: почитать больше о Maven можно на официальном сайте продукта. Часть 5. Сервлеты. Пишем простое веб-приложение Часть 6. Контейнеры сервлетов Часть 7. Знакомство с паттерном MVC (Model-View-Controller) Часть 8. Пишем небольшое приложение на spring-boot
Комментарии (40)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
JNL Уровень 26
11 января 2023
Добрый день, Кто-нибудь может подробней подсказать, как внедрять зависимость ручками(самому загружать jar файлы)? При обычном внедрении, зависимость подсвечивается красным, даже после обновления.
FutureDev Уровень 38
27 ноября 2022
Инструкция для Windows 10. 1. Перешли на сайт и скачали архив (Binary zip archive). 2. Распаковали его туда, где он в дальнейшем будет лежать. К примеру, я закинул в C:\Program Files\Maven и в конечном счёте получилось C:\Program Files\Maven\apache-maven-3.8.6. 3. Теперь к переменным окружения. Создаются/редактируются они здесь: «Мой компьютер → Свойства → Дополнительные параметры системы → Переменные среды…». 3.1 Системная переменная применяется ко всем пользователям, используется в случае отсутствия пользовательской. Пользовательская применяется только к конкретному пользователю (тогда системная, если она такая есть, игнорируется). Я создавал системные, чтобы можно было использовать любую учётную запись с данными настройками. 3.2 Для работы в IntelliJ IDEA создаём переменную M2_HOME и записываем в неё путь к нашему архиву C:\Program Files\Maven\apache-maven-3.8.6. 3.3 Для работы в консоли нам нужно в переменную PATH добавить путь C:\Program Files\Maven\apache-maven-3.8.6\bin (к подпапке bin нашего архива). Можно прописать руками, но тогда в случае смены версии мавена нам придется также руками править не только переменную M2_HOME, но и лезть в переменную PATH, что не очень то удобно. По-этому, мы запишем в PATH следующее %M2_HOME%\bin (где %M2_HOME% - это путь к архиву из переменной M2_PATH, а \bin - продолжение пути, подпапка архива). В таком варианте, при необходимости, править придется только переменную M2_HOME (в PATH значение подтянется автоматически, по ссылке). продолжение ↓↓↓
Ruslan Уровень 51
5 октября 2022
Прекрасная статья
Skiro Уровень 51
3 августа 2022
Если вы пользуетесь macOS или Linux, и у вас не получается установить maven через terminal, то настоятельно советую скачать Homebrew. Для этого вставьте фразу /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" в терминал, введите пароль администратора (курсор не движется) и после установки (примерно 2-5 минут в зависимости от интернет соединения) напишите brew install maven. Вот и всё
otreyo Уровень 38
14 мая 2022
ну пишите вы как установить этот мейвен или пишите вы по человечески, чтобы все было понятно тем кто первый раз это делает или вообще не пишите. в итоге примитивная настройка превращается в мучение и занимает кучу времени.
Уровень 24 Expert
31 марта 2022
Вопрос: есть ли смысл устанавливать мавен отдельно, если он есть и интелиджидее??
vzubkeviсh Уровень 26
11 февраля 2022
что-то совсем не понял про импорт зависимостей и этот вот код

import org.apache.commons.io.FileUtils;

import java.io.File;

public class TestMaven {
   public static void main(String[] args) {
       File tempDirectory = FileUtils.getTempDirectory();
   }
}
что должно появиться, я не понял, мне идея предложила скачать что-то, я скачал, по итогу этого кода нигде не увидел, всё ли я сделал правильно? также вижу в репозиториях версию 2.11.0 от июля 21 года, но идея ругается и предлагает обновить до версии от ноября 2005 года почему-то, это как так?
Kes Уровень 41
9 февраля 2022
Отличная статья! Спасибо. Осмелюсь дополнить. 1. При установке Maven по инструкции, если у вас уже есть Idea, у вас появляется два Maven. Первый тот, который вы установили по инструкции. Второй - это плагин который может иметь другую версию 2. Окно Maven не обязательно "сверху справа". Его нужно еще найти или включить. 3. Команда в Terminal не будет работать, пока вы после настройки Maven не перезапустите Idea. Допускаю, что только после перезапуска Idea подтягиваются переменные окружения. 4. Интересно поиграться с локальным репозиторием. Удалить в нем junit. Далее обновить pom.xml и увидеть, как библиотека снова подгрузится.
Андрей Уровень 28
12 января 2022
Андрей Уровень 28
17 декабря 2021
И как в той же фазе package указать в каком формате нужно упаковывать данные?