User Professor Hans Noodles
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
Комментарии (17)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Сергей Уровень 31, Воронеж, Россия
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!) Спасибо!
Igor Уровень 41, Минск, Беларусь
17 июня 2021

Игнорируйте инструкцию по установке Maven в этой статье.
С новой версией немного по другому.
Смотрите установку Maven для самых маленьких.

Если в конце получилось так как на скрине, значит у вас всё установилось верно.
Сергей Попов Уровень 29, Пермь, Россия
3 июня 2021
от своих мучений добавлю: mvn(пробел)-version
Anonymous #2489173 Уровень 35
31 марта 2021
Но ведь фаз не девять. Согласно документации по умолчанию их семь: https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html а вот в полном списке их намного больше https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference При этом clean и site "последовательно" не выполняются. Их нужно вызывать самостоятельно.
Михаил Уровень 37, Киев, Украина
22 февраля 2021
не получилось в конце(

Plugin 'com.soebes.maven.plugins:uptodate-maven-plugin:' not found
Raphael Уровень 41, Москва, Россия
4 февраля 2021
Скажу от себя как новенький при знакомстве с maven вот в этой ссылке все похожие чувства которые я испытываю при знакомстве с ним автор задаёт все нужные вопросы и ему объясняют на пальцах ) мне помогло, если вдруг кому-то тоже поможет, ставь лайк, подписывайся на канал, жми колокольчик )))
Human Уровень 18
19 декабря 2020
Ihor Уровень 41, Киев, Украина
12 ноября 2020
У меня не получалось п.2-3, помогло https://www.youtube.com/watch?v=F0TaIkocrdw, переменная не M2_HOME a MAVEN_HOME, Path добавить в конце через точку с запятой путь к папке bin
Interstellar Уровень 36, Воронеж, Россия Expert
24 сентября 2020
porn.xml - в одной статье на хабре автор написал 😂