JavaRush/Java блог/Random/Часть 4. Основы Maven
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-плагины. Список официальных плагинов можно посмотреть на сайте Мавена. Но знай, что еще есть много пользовательских плагинов, которые можно найти на сторонних ресурсах. Ну и естественно, при какой-то экзотической необходимости, у тебя всегда остается возможность написать такой плагин самому.

Плагины

Чтобы добавить Мавен-плагин в проект, его описание, аналогично зависимостям, нужно поместить в 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
Комментарии (53)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ilya
Уровень 15
22 января, 23:29
Как в pom.xml добавить pom.xml из других модулей?
ZюMLik
Уровень 51
8 августа 2023, 07:01
по-моему здесь можно уже бросать читать и сразу идти в JSP & Servlets, он свежее и понятнее написано )
Max Dudin
Уровень 108
Expert
25 мая 2023, 16:37
А где мой комментарий... Я же по любому это всё делал
Kurama
Уровень 50
19 мая 2023, 14:27
mvn package mvn : Имя "mvn" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также на личие и правильность пути, после чего повторите попытку.
Balsakas
Уровень 23
1 ноября 2023, 08:20
Вдруг кому актуально: Кратко: В переменные среды пропиши путь к мавену в переменную Path Подробно: Мой компьютер => Управление компьютером => Переменные среды => Тут ищи переменную Path (или PATH), жми изменить и добавляй строку пути к мавену (как пример C:\Maven). После этого перезапусти Идею
Kurama
Уровень 50
17 мая 2023, 16:55
Всё сделал по списку. В итоге "mvn" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Что за ущербная инструкция... Добавьте в "системный" Path C:\Program Files\Maven\apache-maven-3.9.2-bin\apache-maven-3.9.2\bin и C:\Program Files\JDK\jdk-18.0.2.1 Затем перезапустите командную строку
NacWay
Уровень 37
31 марта 2023, 09:12
Как установить maven на винду Сам маялся, по итогу в переменной Path надо указывать путь до .bin файла у распакованного mavenА
Dima Makarov
Уровень 42
11 марта 2023, 13:08
Не ужели только у меня проблема, что файл pom.xml пустой и при новом проекте мавен, не создается такая структура как на скриншоте? Что я делаю не так? Пробовал на двух компьютерах - результат один и тот же. Иначе говоря при создании maven проекта в Intellij IDEA не создается структура папок
Ilgiz Yunusov
Уровень 1
5 октября 2023, 10:10
Друг, попробуй другую версию джавы при сборке проекта. Тоже была такая проблема, в интернете наткнулся на ответ что кому-то помогла смена версии java, поставил 19 вместо 20, и вуаля все заработало.
Dima Makarov
Уровень 42
10 октября 2023, 06:59
да, уже так и сделал, но не пойму почему так происходит. В учебных целях понятно, что нет разницы какую джаву использовать 19 или 20, но если заниматься ком. разработкой, то такие вещи могут довести до паники
Griboed
Уровень 30
17 февраля 2023, 23:36
Для начала нужно установить Maven, скачав его по этой ссылке.
Там по ссылке есть две разновидности архивов с maven: Binary и Source. Так вот, чтобы у вас все работало, и на определенном шаге, где вы задаете переменные среды и проверяете, все ли вы правильно указали, у вас не возникала ошибка:
Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher
Нужно скачивать Binary версию, и к ней прописывать все пути.
JNL
Уровень 27
11 января 2023, 08:40
Добрый день, Кто-нибудь может подробней подсказать, как внедрять зависимость ручками(самому загружать jar файлы)? При обычном внедрении, зависимость подсвечивается красным, даже после обновления.
FutureDev Java Student в Home Corporation ®
27 ноября 2022, 01:02
Инструкция для 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 значение подтянется автоматически, по ссылке). продолжение ↓↓↓
FutureDev Java Student в Home Corporation ®
27 ноября 2022, 01:13
3.4 Если у вас стоит несколько версий JDK, то при работе через консоль будет автоматически выбираться самая новая (но это не точно). Если же мы хотим указать конкретную версию, то создаём переменную JAVA_HOME, указываем в ней путь к папке с JDK нужной версии C:\Program Files\Java\jdk-19. По аналогии с прошлой переменной, добавляем путь в переменную PATH (%JAVA_HOME%\bin). 4. Подтверждаем изменения. На этом этапе можем в консоли ввести команду mvn -v для проверки, как сказано в лекции. 5. Переходим в IntelliJ IDEA. Здесь у нас есть предустановленный плагин мавена (Settings > Plugins). Если мы хотим использовать его, то все шаги выше можно было и не делать. Но если мы хотим использовать установленный с сайта вариант, то нам нужно его выбрать в настройках. Переходим «File → Settings/Preferences → Build, Execution, Deployment → Build Tools → Maven». Строка «Maven home path». На выбор будет несколько вариантов: - Bundled (т.е. предустановленный плагин); - Use Maven wrapper (использовать обертку над мавеном); - C:/Program Files/Maven/apache-maven-3.8.6 (если правильно сделали пункт 3.2 данной инструкции, здесь будет путь к вашему архиву). Полезные ссылки: Статья про переменные (рус) - где их найти, как создавать/редактировать, с иллюстрациями. Инструкции для Maven от JetBrains (eng) - создание проекта на Maven, конфигурирование, установка модулей и т.д. с иллюстрациями актуального интерфейса IntelliJ IDEA (скрины из лекции уже устарели). Инструкция по установке Maven от Apache (eng) - а также много других полезных инструкций от создателей.
Зета Медведя Работает в Вселенной
23 декабря 2022, 14:17
Большое человеческое спасибо!
Dima Makarov
Уровень 42
23 сентября 2023, 11:34
Вопрос по 5 пункту, ставлю мавен который установлен, нажимаю новый проект на мавен в нем вхожу в настройки а все равно используется встроенный мавен. Что за ерунда?