Основы Maven: что это такое и как работает
Собираем проект на Java быстро, без регистрации и СМС.
Иллюстрация: Lip Kee / Apache Software Foundation / Wikimedia Commons / John Fowler / Maksym Ostrozhynskyy / Brett Wharton / Ben Kolde / Unsplash / Дима Руденок для Skillbox Media
Если спросить у Java-разработчика, кто его лучший друг, то, скорее всего, он расскажет про Apache Maven. Это фреймворк для автоматизации сборки проектов на основе описания их структуры в файлах на языке POM (Project Object Model).
Пока что звучит сложно, но в этой статье мы разберёмся в основах работы со сборщиком проектов и заглянем в его сердце — файл pom.xml.
Что вы узнаете про Maven:
- зачем он нужен и есть ли у него аналоги;
- как его правильно установить на компьютер и можно ли обойтись без этого;
- как его настроить и собрать свой первый проект;
- зачем ему репозитории и какими они бывают.
Что такое Maven
Maven — это инструмент для автоматической сборки проектов на Java и других языках программирования. Он помогает разработчикам правильно подключить библиотеки и фреймворки, управлять их версиями, выстроить структуру проекта и составить к нему документацию.
Например, чтобы собрать приложение для управления базами данных на Java, нам понадобятся фреймворки Spring и Hibernate, библиотека JUnit для модульного тестирования и сама база данных. Всё это можно собрать в одном проекте вручную, но могут быть трудности из-за большого числа зависимостей. Здесь на помощь разработчикам приходит Maven. Он автоматически добавит эти или другие зависимости в проект и соберёт его в исполняемый файл.
Maven — не единственный сборщик проектов. Некоторые разработчики используют его аналоги — Gradle и Ant. Но именно Maven сегодня — золотой стандарт в индустрии.
Установка Maven
Maven можно установить вручную или воспользоваться IDE с предустановленным сборщиком. Второй вариант удобнее и быстрее, но начнём мы с обычной установки в операционную систему.
Важно! Чтобы работать с Java, у вас на компьютере должен быть установлен и настроен JDK. Мы уже писали, как это сделать правильно.
Установка Maven вручную
Скачайте архив со сборщиком для своей операционной системы с официального сайта Apache Maven и распакуйте его. Лучше всего создать для этого отдельную папку, так как путь к ней нам понадобится позже.
Если у вас Linux, то установку можно запустить через командную строку:
Для удобной работы с Maven и его запуска в командной строке или терминале необходимо прописать переменные среды. На разных операционных системах этот процесс различается.
Windows
Процесс установки на Windows 7, 10 и 11 одинаков. Нажмите правой клавишей мыши на Этот компьютер и выберите пункт меню Свойства. Теперь пройдите через несколько окон: Дополнительные параметры системы → Дополнительно → Переменные среды.
В окне Переменные среды найдите переменную Path и нажмите на кнопку Изменить:
В открывшемся окне нажмите кнопку Создать и укажите полный адрес до папки bin из распакованного архива Maven:
Проверьте настройку переменных среды. Для этого зайдите в командную строку и введите mvn -v. Если Maven установлен, то появится информация о его версии:
Linux/Mac
Откройте в текстовом редакторе файл ~/.bashrc или ~/.bash_profile в Linux или .zshrc в macOS. Файл находится в домашней директории текущего пользователя. Если файла нет, создайте его и впишите:
Вместо path_to_maven указываем путь к файлу ~/.bashrc или ~/.bash_profile в Linux или .zshrc в macOS.
Проверьте настройку переменных среды. Для этого зайдите в терминал и запустите mvn -n. Должно появиться сообщение с версией Maven:
Для Mac в последней строке будет указано family: "mac".
Использование Maven в IntelliJ IDEA
Для работы с Maven мы будем использовать IntelliJ IDEA. Это удобная среда разработки, в которой сборщик проектов установлен из коробки.
Настройки Maven в IDE можно найти в правой части рабочей области после создания проекта на Java:
Читайте также:
Настройка Maven и сборка проекта
Начнём работу с создания шаблона проекта. Среда разработки и здесь сэкономит нам время, так как самостоятельно пропишет необходимые параметры.
Создайте новый проект:
Программа предложит выбрать Maven Archetype в качестве шаблона сборки. Кликните на него и в окне преднастроек выберите Archetype quickstart. Нажмите Create:
В окне проекта вы увидите, как Maven зашёл в репозитории и начал что-то скачивать, — это нормально:
Слева на экране показана структура проекта. Нам нужен класс App.java, в котором находится метод main. Чтобы найти его, откройте папку src, затем main и java. Внутри App.java хранится небольшой фрагмент кода:
Метод работает просто — он выводит в консоль сообщение Hello World!.
Теперь перейдите к файлу pom.xml. Это основной конфигурационный файл в проекте, который описывает его структуру, зависимости и настройки. Можно сказать, что это главная сила всего Maven.
Если открыть файл, то увидим такой код:
Разберём, что к чему:
project — корневой элемент, содержащий всю информацию о проекте.
xmlns, xmlns:xsi, xsi:schemaLocation — это атрибуты для указания пространства имён и схемы для pom.xml. Проще говоря, здесь указано, что должно содержаться в файле и как это всё должно быть расположено.
modelVersion — версия модели POM, которую данный файл использует. У нас версия 4.0.0.
groupId, artifactId, version — это обязательные элементы для идентификации содержимого проекта.
- groupId — это идентификатор команды. В нашем случае — org.example, как и пакет с классом App. В больших компаниях идентификатор определяет группу или команду разработчиков. Например, представим, как мог бы выглядеть идентификатор компании ACME. Веб-разработчики в ней будут использовать идентификатор группы com.acme.webapps, а мобильные разработчики — com.acme.mobile.
- artifactId — это идентификатор артефакта. Артефактами Maven называет приложения, пакеты и файлы. Как и идентификатор группы, он нужен, чтобы не запутаться в проекте. По умолчанию идентификатор артефакта соответствует имени проекта, которое мы указали при его создании. У нас это maven-example.
- version — версия проекта. Меняется при обновлении проекта.
packaging — тип упаковки проекта. У нас всё упаковывается в JAR-файл.
name — имя проекта.
url — URL-адрес, связанный с проектом.
properties — здесь указываем переменные проекта. В нашем случае мы прописываем только кодировку, задавая её по умолчанию как UTF-8. Точно так же мы можем указать версии зависимостей, конфигурации плагинов, фильтры ресурсов и другие параметры. Полный список настроек доступен в документации Maven.
Работают properties так: прописываете информацию в pom.xml, потом подставляете в нужном вам месте конструкцию с названием созданной вами properties — ${имя_properties}. Это если значение нужно упомянуть в pom.xml. В классах значение properties получаем через геттеры:
dependencies — здесь определяются зависимости проекта — библиотеки, которые будут использоваться. В нашем указана только зависимость от JUnit версии 3.8.1. В dependencies, так же как и для всего проекта, прописываются идентификаторы groupId, artifactId и version. Только здесь они прописаны для каждой библиотеки по отдельности.
scope указывает на то, для чего библиотека используется. Мы прописали область test — JUnit будет доступен только для запуска тестов, но не будет включён в основной код проекта.
Теперь запустим наш проект. Для этого нажмите run в окне App.java:
Всё сработало как надо — появился текст Hello World!:
Поздравляем! Вы собрали первый проект в Maven.
Репозитории Maven
Maven умеет не только выводить что-то в консоль. Его мощь — в библиотеках, которые можно подключить к проекту. Для этого используются репозитории.
Репозитории Maven — это хранилища, где находятся библиотеки. Что-то вроде Google Play или App Store, но для сборщика проектов. Репозитории бывают локальными и удалёнными. Последние делятся на общедоступные и сторонние.
Локальный репозиторий расположен на вашем компьютере. Там Maven хранит библиотеки, которые вы используете в своих проектах.
Когда вы загружаете библиотеку в первый раз, Maven сохраняет её в локальном репозитории. Все последующие проекты используют уже загруженную версию, что позволяет сэкономить время на её скачивании.
Общедоступный, или центральный, репозиторий — это хранилище библиотек, предоставляемых Apache Maven. Именно к нему обращается сборщик по умолчанию.
Сторонние репозитории предоставляют какие-либо организации или сообщества. Чтобы Maven искал библиотеки именно в них, необходимо это настроить.
Библиотеки могут быть в состоянии снапшота (SNAPSHOT) или релиза (release). Снапшоты — это версии библиотек в разработке. Они могут меняться внутри без изменения номера версии. Это может привести к проблемам, так как версия библиотеки остаётся прежней, но её функциональность может измениться. Релизы — стабильные версии библиотек, которые не изменяются, а выпускаются под конкретным номером. Лучше всего использовать именно их.
Настройки работы Maven с репозиториями прописаны в settings.xml. Сам файл находится в папке conf вашей директории с Maven:
Откройте settings.xml в любом текстовом редакторе. Там много кода, но нам нужна секция <mirrors>. По умолчанию она выглядит так:
Что тут есть:
id — уникальный идентификатор для данного зеркала. В этом случае ID установлен как maven-default-http-blocker. Такая конфигурация блокирует внешние репозитории, использующие протокол HTTP. Это полезно, когда мы хотим пользоваться только локальными репозиториями.
mirrorOf — этот элемент указывает, для каких репозиториев будет применяться зеркало. У нас прописан шаблон external:http:*, который означает, что сборщик будет блокировать все внешние репозитории, использующие протокол HTTP, без каких-либо ограничений.
name — имя и описание для зеркала.
url — URL зеркала. Здесь указан фиктивный URL http://0.0.0.0/ в качестве заглушки.
blocked — определяет, блокируется указанное зеркало или нет. У нас установлено значение true, то есть доступ к внешним репозиториям заблокирован.
Если мы хотим, чтобы Maven искал библиотеки в других репозиториях, то должны добавить в <mirrors> блок по шаблону:
В url впишите адрес желаемого репозитория. Теперь Maven сможет его найти.
Что запомнить
Резюмируем всё, что мы узнали про сборщик проектов:
- Maven облегчает рутинные задачи по сборке проектов на Java и некоторых других языках программирования.
- Главная сила Maven — это pom-файлы, позволяющие точно настроить сборку проекта с учётом всех используемых библиотек и фреймворков.
- Для хранения библиотек используются репозитории. Они могут быть локальными, то есть располагаться на вашем компьютере, и удалёнными. Это позволяет гибко настроить доступ к библиотекам и использовать нужные нам версии.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!