JavaRush/Java блог/Random/Основы Maven
Professor Hans Noodles
41 уровень

Основы Maven

Статья из группы Random
участников
Этот материал — часть цикла “Введение в Enterprise-разработку”. Предыдущие статьи: Maven — инструмент для управления и сборки проектов — настоящий помощник Java-программиста.Часть 4. Основы Maven - 1Он облегчает жизнь девелоперу на всех стадиях работы: от создания структуры проекта и подключения необходимых библиотек до развертывания продукта на сервере. При работе с любым фреймворком придется использовать 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
Комментарии (57)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Kiawem
Уровень 51
28 мая 2024, 16:43
для всех кто с macOS начиная вроде с Catalina есть два варианта: -через brew -через скачку с сайта вот виде ооооочень понятное, если у вас нет .zshrc не переживайте пишите все как он все хорошо https://www.youtube.com/watch?v=QhmE2Vzxk5g
Ilya
Уровень 15
22 января 2024, 23:29
Как в pom.xml добавить pom.xml из других модулей?
ZюMLik
Уровень 51
8 августа 2023, 07:01
по-моему здесь можно уже бросать читать и сразу идти в JSP & Servlets, он свежее и понятнее написано )
PochiРаботяга в Завод
24 августа 2024, 12:54
Это интересно, потому что я прямиком от туда инфа там подана достаточно бестолково. Хотя всегда есть вероятность, что дело во мне
Max Dudin
Уровень 6
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). После этого перезапусти Идею
Anonymous #3380175
Уровень 2
20 декабря 2024, 18:39
добавлю еще что в Path нужно прописать путь к IDEA
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, но если заниматься ком. разработкой, то такие вещи могут довести до паники
German
Уровень 41
20 июля 2024, 16:29
Была та же проблема. На сайте разработчика только 17. Но и с ней все заработало
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 файлы)? При обычном внедрении, зависимость подсвечивается красным, даже после обновления.