Часть 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
Комментарии (30)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Skiro Уровень 39, Минск, Belarus
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 Уровень 32
14 мая 2022
ну пишите вы как установить этот мейвен или пишите вы по человечески, чтобы все было понятно тем кто первый раз это делает или вообще не пишите. в итоге примитивная настройка превращается в мучение и занимает кучу времени.
Уровень 24, Россия
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 указать в каком формате нужно упаковывать данные?
Андрей Уровень 28, Москва
17 декабря 2021
Знать бы что такое артефакты...
Сергей Уровень 32, Воронеж, Россия
8 октября 2021
Инструкция для тех у кого стоит Windows 10 и JDK (актуальная на 08.10.2021). 1. Переходим по ссылке и скачиваем архив apache-maven-3.8.3-bin.zip. 2. Распаковываем архив в удобном месте. У меня это "C:\Program Files\Maven". В итоге все файлы из архива у меня лежат в директории "C:\Program Files\Maven\apache-maven-3.8.3". 3. В поиске Windows вбиваем "Изменение переменных среды". Из предложенных вариантов выбираем "Изменение переменных среды текущего пользователя". 4. Теперь нам необходимо указать путь javac, чтобы при запуске java программ, нам не нужно было каждый раз указывать путь к компилятору. Для этого в Системных переменных создаем переменную "JAVA_HOME" и указываем путь к нашей JDK. У меня это "C:\Program Files\Java\jdk-14.0.2". Далее чтобы командная строка Windows могла работать с командами javac нам нужно указать путь к папке bin. Для этого в Системных переменных находим строчку PATH, выбираем ее и нажимаем Изменить. Далее нажимаем Создать и в новую строчку вставляем следующий текст "%JAVA_HOME%\bin". 5. Теперь нам необходимо установить сам Maven. Для этого в Системных переменных создаем переменную "MAVEN_HOME" и указываем путь к нашей JDK. У меня это "C:\Program Files\Maven\apache-maven-3.8.3". Далее чтобы командная строка Windows могла работать с командами Maven нам нужно указать путь к папке bin. Для этого в Системных переменных находим строчку PATH, выбираем ее и нажимаем Изменить. Далее нажимаем Создать и в новую строчку вставляем следующий текст "%MAVEN_HOME%\bin".
NaN Уровень 4, Одесса, Украина
7 августа 2021
Получилось с OkHttp с Maven!) Спасибо!