Код
#статьи

Основы 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, то установку можно запустить через командную строку:

sudo команда-вашего-пакетного-менеджера maven

Для удобной работы с Maven и его запуска в командной строке или терминале необходимо прописать переменные среды. На разных операционных системах этот процесс различается.

Windows

Процесс установки на Windows 7, 10 и 11 одинаков. Нажмите правой клавишей мыши на Этот компьютер и выберите пункт меню Свойства. Теперь пройдите через несколько окон: Дополнительные параметры системыДополнительноПеременные среды.

В окне Переменные среды найдите переменную Path и нажмите на кнопку Изменить:

Окно с перечнем всех переменных среды. Хотя обычно они отсортированы по алфавиту, может потребоваться прокрутить список с ними
Скриншот: Skillbox Media

В открывшемся окне нажмите кнопку Создать и укажите полный адрес до папки bin из распакованного архива Maven:

Скриншот: Skillbox Media

Проверьте настройку переменных среды. Для этого зайдите в командную строку и введите mvn -v. Если Maven установлен, то появится информация о его версии:

Скриншот: Skillbox Media

Linux/Mac

Откройте в текстовом редакторе файл ~/.bashrc или ~/.bash_profile в Linux или .zshrc в macOS. Файл находится в домашней директории текущего пользователя. Если файла нет, создайте его и впишите:

export PATH="<path_to_maven>:$PATH"

Вместо path_to_maven указываем путь к файлу ~/.bashrc или ~/.bash_profile в Linux или .zshrc в macOS.

Проверьте настройку переменных среды. Для этого зайдите в терминал и запустите mvn -n. Должно появиться сообщение с версией Maven:

Скриншот: Skillbox Media

Для Mac в последней строке будет указано family: "mac".

Использование Maven в IntelliJ IDEA

Для работы с Maven мы будем использовать IntelliJ IDEA. Это удобная среда разработки, в которой сборщик проектов установлен из коробки.

Настройки Maven в IDE можно найти в правой части рабочей области после создания проекта на Java:

Скриншот: Skillbox Media

Настройка Maven и сборка проекта

Начнём работу с создания шаблона проекта. Среда разработки и здесь сэкономит нам время, так как самостоятельно пропишет необходимые параметры.

Создайте новый проект:

Скриншот: Skillbox Media

Программа предложит выбрать Maven Archetype в качестве шаблона сборки. Кликните на него и в окне преднастроек выберите Archetype quickstart. Нажмите Create:

Скриншот: Skillbox Media

В окне проекта вы увидите, как Maven зашёл в репозитории и начал что-то скачивать, — это нормально:

Скриншот: Skillbox Media

Слева на экране показана структура проекта. Нам нужен класс App.java, в котором находится метод main. Чтобы найти его, откройте папку src, затем main и java. Внутри App.java хранится небольшой фрагмент кода:

package org.example;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

Метод работает просто — он выводит в консоль сообщение Hello World!.

Теперь перейдите к файлу pom.xml. Это основной конфигурационный файл в проекте, который описывает его структуру, зависимости и настройки. Можно сказать, что это главная сила всего Maven.

Если открыть файл, то увидим такой код:

<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>org.example</groupId>
<artifactId>maven-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>


<name>maven-example</name>
<url>http://maven.apache.org</url>


<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>


<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

Разберём, что к чему:

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 получаем через геттеры:

String appVersion = System.getProperty("app.version");

dependencies — здесь определяются зависимости проекта — библиотеки, которые будут использоваться. В нашем указана только зависимость от JUnit версии 3.8.1. В dependencies, так же как и для всего проекта, прописываются идентификаторы groupId, artifactId и version. Только здесь они прописаны для каждой библиотеки по отдельности.

scope указывает на то, для чего библиотека используется. Мы прописали область test — JUnit будет доступен только для запуска тестов, но не будет включён в основной код проекта.

Теперь запустим наш проект. Для этого нажмите run в окне App.java:

Скриншот: Skillbox Media

Всё сработало как надо — появился текст Hello World!:

Скриншот: Skillbox Media

Поздравляем! Вы собрали первый проект в Maven.

Репозитории Maven

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

Репозитории Maven — это хранилища, где находятся библиотеки. Что-то вроде Google Play или App Store, но для сборщика проектов. Репозитории бывают локальными и удалёнными. Последние делятся на общедоступные и сторонние.

Локальный репозиторий расположен на вашем компьютере. Там Maven хранит библиотеки, которые вы используете в своих проектах.

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

Общедоступный, или центральный, репозиторий — это хранилище библиотек, предоставляемых Apache Maven. Именно к нему обращается сборщик по умолчанию.

Сторонние репозитории предоставляют какие-либо организации или сообщества. Чтобы Maven искал библиотеки именно в них, необходимо это настроить.

Библиотеки могут быть в состоянии снапшота (SNAPSHOT) или релиза (release). Снапшоты — это версии библиотек в разработке. Они могут меняться внутри без изменения номера версии. Это может привести к проблемам, так как версия библиотеки остаётся прежней, но её функциональность может измениться. Релизы — стабильные версии библиотек, которые не изменяются, а выпускаются под конкретным номером. Лучше всего использовать именно их.

Настройки работы Maven с репозиториями прописаны в settings.xml. Сам файл находится в папке conf вашей директории с Maven:

Скриншот: Skillbox Media

Откройте settings.xml в любом текстовом редакторе. Там много кода, но нам нужна секция <mirrors>. По умолчанию она выглядит так:

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
  </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> блок по шаблону:

<mirror>
            <id>external-repos</id>
            <url>https://repo.example.com/maven2</url>
            <mirrorOf>external:*</mirrorOf>
        </mirror>

В url впишите адрес желаемого репозитория. Теперь Maven сможет его найти.

Что запомнить

Резюмируем всё, что мы узнали про сборщик проектов:

  • Maven облегчает рутинные задачи по сборке проектов на Java и некоторых других языках программирования.
  • Главная сила Maven — это pom-файлы, позволяющие точно настроить сборку проекта с учётом всех используемых библиотек и фреймворков.
  • Для хранения библиотек используются репозитории. Они могут быть локальными, то есть располагаться на вашем компьютере, и удалёнными. Это позволяет гибко настроить доступ к библиотекам и использовать нужные нам версии.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!

Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Научитесь: Профессия Java-разработчик Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована