
На первом занятии нашего нового курса мы узнаем, что такое Apache Maven. Для чего он используется и заглянем немного в прошлое, чтобы понять, как раньше разработчики обходились без этого приложения.
00:00 - Введение
00:34 - Языки команд batch и shell
00:53 - Структура команд
03:10 - batch и shell скрипты
04:41 - Apache Ant и Make
06:16 - Apache Maven
07:07 - Gradle
Для прохождения курса нам необходимо будет установить программное обеспечение. Мы будем использовать Java 15, среду разработки IntelliJ IDEA и конечно же сам Apache Maven. После успешной установки всего ПО мы должны иметь возможность в командой строке проверить версии Java и Apache Maven.
Ссылка на скачивание Java 15: https://www.oracle.com/java/technologies/javase-jdk15-downloads.html
Ссылка на скачивание среды разработки IntelliJ IDEA: https://www.jetbrains.com/idea/download
Ссылка на скачивание Apache Maven (не обязательно, ибо идет вместе с установкой IntelliJ IDEA): https://maven.apache.org/download.cgi
00:00 - Введение
00:15 - Установка Java 15
01:36 - Переменная среды PATH (Unix)
03:13 - Переменная среды PATH (Windows)
03:34 - Установка IntelliJ IDEA
04:06 - Установка Apache Maven
Plugins - это основа Maven, его ядро. Именно с plugins мы будем всегда работать во время вызова соответствующих команд mvn в командной строке. В свою очередь они состоят из множества целей (goals), которые представляют из себя обычные Java классы - Mojo. На видео более подробно разберемся со всеми новыми понятиями и определениями.
Ссылка на исходный код Apache Maven: https://maven.apache.org/scm.html
00:00 - Введение
00:15 - Plugins и goals
01:35 - Исходный код Apache Maven
03:02 - compiler plugin
05:57 - Вызов первой цели compiler:help
07:11 - Резюме
На предыдущем занятии мы видели, как принято передавать параметры во время вызова наших целей у Maven на примере compiler:help. Но на самом деле это характерно не для Maven плагинов, а для любых Java приложений. Другими словами говоря, во время запуска Java приложения через консоль мы можем передать параметры несколькими различными способами, что и будет объяснено в видео, потому что это довольно часто встречаемый функционал и его необходимо знать.
00:00 - Введение
01:33 - JVM options -D, -X, -XX
03:48 - Program arguments
05:15 - Класс System
06:39 - Environment variables
07:04 - Резюме
Первый вспомогательный Maven плагин, с которым мы познакомимся, будет Archetype plugin. Он позволяет создавать проекты соблюдая Maven структуру. Причем различных архетипов на различные типы и конфигурации проектов есть просто в огромном количестве (несколько тысяч). Таким образом вы можете создать для себя как обычный практически пустой Maven проект, так и веб проект или даже проект с настроенными фреймворками, такими как Hibernate или Spring.
00:00 - Введение
00:21 - Исходный код archetype plugin
00:51 - archetype plugin goals
01:59 - quickstart archetype
03:26 - Maven project naming convention
05:10 - Project version convention
06:56 - Maven projects structure
09:14 - Резюме
POM (Project Object Model) - это основной конфигурационный xml файл, который используется во всех Maven проектах. На видео разобьем его на 4 основных секции, чтобы лучше понимать довольно непростую и объемную структуру xml файлов, и разберемся с каждой из них.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-6
00:00 - Введение
00:23 - 1. General Project Information
00:49 - 2. Build Environment
01:27 - 3. POM Relationships
02:25 - 4. Build settings
03:34 - Пример POM нашего проекта
09:08 - Директория target
В Apache Maven есть механизм наследования подобный наследованию в языке программирования Java. И базовый POM xml, от которого наследуются по умолчанию все другие POM, называется Super POM, про который мы и будем разговаривать в видео. Также на основании этого мы придем к новому термину - effective pom, который подробно разберем.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-7
Ссылка на документацию Super POM версии 3.6.3: https://maven.apache.org/ref/3.6.3/maven-model-builder/super-pom.html
00:00 - Введение
00:47 - Структура Super POM
04:24 - Plugins по умолчанию
05:13 - Goal help:effective-pom
Одна из самых главных составляющих Apache Maven - это управление зависимостями, когда с помощью тега dependency мы можем подключить любую jar, просто указав ее уникальный идентификатор в maven репозитории, т.е. groupId:artifactId:version. Этот уникальный ключ по-другому еще называется Maven Coordinates. Также узнаем, как и где Apache Maven хранит все зависимости и что такое локальный репозиторий (Local repository).
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-8
00:00 - Введение
00:25 - Tag dependencies
03:02 - Local repository
05:30 - Путь зависимости в local repository
07:41 - Импорт зависимостей в IntelliJ IDEA
08:56 - Резюме
В тэге dependency есть возможность указывать другие теги, и один из основных - это тег scope, который имеет большое значение на использование jar в проекте. Более подробно остановимся на всех 5 различных видах scope, чтобы разобраться в каждом из них. Для анализа всех зависимостей восопльзуемся еще одним специальным плагином dependency
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-9
00:00 - Введение
00:57 - Tag scope
01:26 - Compile scope
01:59 - Provided scope
02:47 - Runtime scope
04:14 - System scope
04:39 - Test scope
05:19 - Dependency plugin
В механизме подключения и использования зависимостей есть один не очень приятный нюанс - транзитивные зависимости. Они могут доставить довольно много хлопот, если не знать, как они работают, как их Maven выкачивает и как решать конфликты зависимостей. На видео подробно остановимся и разберем все перечисленные аспекты.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-10
00:00 - Введение
00:56 - Определение транзитивных зависимостей
02:08 - Конфликты версий зависимостей
05:21 - Tag exclusions
06:41 - Tag optional
08:05 - Интеграция Maven и IntelliJ IDEA
Жизненный цикл проекта - это основной аспект Apache Maven, который полностью позволяет управлять жизнедеятельностью нашего приложения, начиная от написания исходных кодов и заканчивая разворачиванием приложения на веб сервере. Их существует всего 3: Clean, Default (Build) и Site. На видео подробно разберем каждый из них.
00:00 - Введение
00:31 - Жизненные циклы в Maven
01:30 - Clean lifecycle
01:52 - Default (Build) lifecycle
04:25 - Site lifecycle
05:00 - Исходники compiler plugin
05:59 - Основные фазы и их цели в Maven
06:54 - Запуск Clean lifecycle из консоли
08:02 - Запуск Clean lifecycle из IntelliJ IDEA
С этого видео начнем разбираться с самым главным жизненным циклом проекта - Default. И первые основные фазы его - это Validate и Compile. Разберем подробно каждую из них, а также все промежуточные фазы между ними, и какие цели плагинов срабатывают по умолчанию для этих фаз.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-12
00:00 - Введение
00:43 - Фаза Validate
01:30 - Фаза Compile и порядок вызова фаз
03:59 - Compile and resources plugin goals
07:17 - Переопределение Compiler plugin
Продолжаем разбираться с Default жизненным циклом в Apache Maven и на очереди у нас следующая основная фаза, которая подготавливает тестовые классы, тестовые ресурсы и запускает тесты - это Test. Подробно разберем ее на видео.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-13
00:00 - Введение
00:47 - Фаза Test и промежуточные фазы
02:30 - TestResources plugin goal
04:13 - TestCompile plugin goal
05:55 - Surefire plugin. Test goal
07:15 - Skip tests
08:22 - Includes tests
В третьем видео по Default жизненному циклу проекта разберем очень важную фазу - package. Дело в том, что именно packaging type влияет на перечень plugin goals, которые вызываются в зависимости от запущенной фазы. Более подробно поговорим об этом в видео, а также уделим внимание тому, что итоговая jar не содержит внутри себя зависимостей, и как сделать так, чтобы она была executable.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-14
00:00 - Введение
01:50 - Фаза package и промежуточные фазы
03:32 - Packaging types и соответствующие им плагины
07:50 - Исходный код всех packaging types
08:40 - Not executable jar by default
Так как большинство приложений в наше время - это веб приложения, то нам нужно разобраться с таким packaging type как war. Мы с ним уже сталкивался на предыдущем курсе по HTTP. Servlets, и в создании такого типа артефакта нам помогала IntelIiJ Idea. Теперь же посмотрим как выглядит Maven структура веб приложения.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-15
00:00 - Введение
00:50 - Создание веб приложения через архетип
03:49 - Создание веб приложения из существующего
05:42 - Создание актефактов в настройках проекта
08:39 - Tag finalName
До текущего момента мы сталкивались только с плагинами и их целями, которые уже были по умолчанию привязаны к нашему жизненному циклу проекта, и они автоматически запускались при указании нужной фазы. На видео поговорим о том, как привязывать самостоятельно цели любых плагинов к любой фазе.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-16
00:00 - Введение
00:18 - copy-resources goal
01:46 - Tag executions
02:51 - Исходный код maven-resources-plugin
04:44 - Maven properties и expression language
08:15 - Привязка цели к фазе
09:19 - Вызов цели из maven-compiler-plugin
Следующая основная фаза в default project lifecycle - это verify, которая используется для запуска и верификации уже интеграционных тестов. Для этого нам понадобится уже другой плагин - failsafe plugin, которые и нужен специально для запуска интеграционных тестов, в отличие от уже пройденного нами на фазе test - surefire plugin, который нужен исключительно для unit тестов. На видео подробно разберемся как подключить этот плагин и его нюансы.
Ссылка на failsafe plugin: https://maven.apache.org/surefire/maven-failsafe-plugin/usage.html
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-17
00:00 - Введение
00:14 - verify phase
01:21 - failsafe plugin. Теория
03:34 - failsafe plugin. Практика
06:50 - test reports
Следующая фаза из default lifecycle - это install phase, которая позволяет сохранять собранные артефакты на фазе package в локальных репозиторий, который в свою очередь по умолчанию у нас находится в ~/.m2/repository. На видео более подробно разберем все нюансы этой фазы.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-18
00:00 - Введение
00:41 - install phase. Теория
02:22 - install phase. Практика
03:53 - Как найти артефакты в локальном репозитории
04:43 - Собранный артефакт как зависимость
06:23 - Good practice to override default plugins
Заключительная фаза default lifecycle - это deploy phase, которая занимается передачей артефактов из локального репозитория (~/.m2/repository) в указанный удаленный репозиторий. По умолчанию, никаких настроек удаленного репозитория не предоставляется, что и логично. Поэтому запуск этой фазы не приведет к успешному завершению. Следовательно, на занятии поднимем свой удаленный репозиторий Nexus и попробуем настроить наш проект так, чтобы мы смогли на фазе deploy скопировать туда свой артефакты из локального репозитория.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-19
Ссылка на nexus docker image: https://hub.docker.com/r/sonatype/nexus3
00:00 - Введение
00:49 - deploy phase. Теория
03:13 - Nexus
05:00 - Tag distributionManagement
07:12 - Файл settings.xml
09:36 - Настройка удаленного сервера в settings.xml
10:46 - Тестирование deploy phase и Nexus
12:59 - Резюме
На видео разберем последний третий жизненный цикл в Maven проектах - это Site Lifecycle, который содержит всего лишь одну основную фазу Site и занимается тем, что генерирует отчеты по нашему проекту. Также познакомимся с таким хорошим и активно используемом в реальных проектах плагине - Jacoco, который нужен для генерации статистики (отчетов) по покрытию тестами. Более того, этот плагин позволяет даже фейлить билд, если процент покрытия тестами недостаточный.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-20
Ссылка на документацию по Jacoco plugin: https://www.eclemma.org/jacoco/trunk/doc/maven.html
00:00 - Введение
00:14 - Site Lifecycle
01:15 - Настройка site plugin
02:33 - Структура сгенерированного отчета
03:40 - Настройка Jacoco plugin
07:25 - Jacoco отчет о покрытии тестами
Реальные приложения намного больше, чем мы практикуем на курсах, поэтому принято разбивать их на более мелкие кусочки, чтобы было легче поддерживать их, изменять и разворачивать на production. Следовательно, в Apache Maven есть специальная возможность для таких нужд - это модули. На видео подробно поговорим про Multimodule project.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-21
00:00 - Введение
00:41 - Наследование в multimodule projects
03:18 - Создание database модуля
05:59 - Создание service модуля
07:47 - Запуск жизненного цикла указанного модуля
08:36 - Создание web модуля
10:58 - Parent модуль
Так как multimodule проекты основаны целиком и полностью на наследовании, то мы можем воспользоваться этим для своих нужд. И в данном видео мы разберем таким специальные секции в parent pom.xml как PluginManagement и DependencyManagement. Также немного затронем тему свойств в Apache Maven (properties), с которыми более подробно познакомимся в отдельном видео этого курса, и зависимости между модулями в одном multimodule проекте.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-22
00:00 - Введение
00:34 - Переопределение любых элементов
01:19 - Секция dependencyManagement
05:09 - Секция pluginManagement
07:52 - Properties для групп зависимостей
09:08 - Зависимость между модулями
13:48 - Parent pom как отдельный модуль
На видео вернемся к свойствам в Apache Maven и более подробно разберем все 5 различных вариантов их. Более того, поговорим про такую интересную возможность как Resource Filtering, которая помогает нам подставлять через expression language различные свойства из Apache Maven в ресурсных файлах.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-23
00:00 - Введение
00:24 - 5 вариантов указания Properties
02:50 - Resource Filtering
04:45 - Tags resources и testResources
Профайлы - это еще одна прекрасная возможность в Apache Maven, которая позволяет нам видоизменять effective pom в зависимости от каких-то условий или, другими словами говоря, активации этих профайлов. На занятии поговорим более подробно, как именно можно запускать и активировать профайлы, а также как можно посмотреть текущие активированные профайлы в проекте через специальную цель help:active-profiles.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-24
00:00 - Введение
00:12 - Tag profiles
03:20 - Запуск профайлов
04:08 - Debug mode -X
05:19 - Gole help:active-profiles
06:00 - Tag activation
Maven package phase собирает наши модули в соответствующие packaging type артефакты. Мы их можем использовать не только как зависимости в других модулях и проектах, но и для того, чтобы запустить как обычные Java приложения. На видео разберем, как это сделать правильно и для чего нам необходим MANIFEST.MF файл.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-25
00:00 - Введение
00:28 - Запуск класса с методом main
02:50 - Запуск jar файла
04:05 - Файл META-INF/MANIFEST.MF
06:08 - Переопределение maven-jar-plugin
08:22 - Использование классов из зависимостей
К сожалению, для добавления jar файлов всех зависимостей (и транзитивных тоже) нам недостаточно стандартного подхода, что мы делали на предыдущем занятии. Поэтому узнаем два варианта решения этой проблемы: 1 - через скачивание всех зависимостей в отдельную директорию и указание пути к ней (как это сделано в Tomcat или Maven), 2 - распаковка всех зависимостей и подкладывание всех классов из них в нашу jar. На видео попрактикуемся с обоими вариантами.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-26
Ссылка на maven-assembly-plugin: http://maven.apache.org/plugins/maven-assembly-plugin/usage.html
00:00 - Введение
00:31 - Class-Path в файле MANIFEST.MF
01:47 - maven-dependency-plugin
05:36 - maven-assembly-plugin
10:02 - Резюме
На любом проекте рано или поздно необходимо делать релизные версии. Мы уже затрагивали тему именования версий в Maven проектах, и почему по умолчанию мы видим постфикс SNAPSHOT. На видео поговорим об этом более подробно и подключим maven-release-plugin, который поможет нам сделать релиз нашего проекта.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-27
00:00 - Введение
00:57 - Устройство release plugin
02:52 - Подключение release plugin
04:39 - Секция scm
06:55 - release:prepare goal
10:51 - release:perform goal
У нас есть еще один packaging type с названием maven-plugin, который как раз-таки и используется для написания собственных плагинов. Для этого нам понадобится подключить еще парочку зависимостей с scope provided, потому что Maven содержит уже эти зависимости и нам все необходимое предоставит. На видео создадим собственный плагин.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-28
00:00 - Введение
00:40 - Создание модуля hello-plugin
02:51 - Класс HelloMojo
03:52 - Подключение и использование hello-plugin
06:17 - Параметры в hello-plugin
09:37 - Резюме
В заключительном видео курса по Apache Maven по традиции поговорим про дальнейшим путь развития нас как разработчиков. Также затронем тему maven wrapper, который является очень удобным инструментов и часто используется в реальных приложениях.
Ссылка на код с занятия: https://github.com/dmdev2020/apache-maven-starter/tree/lesson-29
00:00 - Введение
00:26 - Книга "Maven. The Definitive Guide"
00:47 - Maven wrapper
03:58 - Groovy и Gradle
Курс Apache Maven содержит информацию про инструмент автоматизированной сборки проектов, который полностью отвечает за жизненный цикл Java приложений. Зайдем в исходный код Apache Maven, чтобы понять основное ядро его, которым на самом деле являются плагины и Mojo (Maven plain Old Java Object). Поэтому на практике разберем основные плагины, которые чаще всего используются в реальных проектах:
- Surefire для запуска unit тестов
- Failsafe для запуска integration тестов
- Jacoco для генерации документации о пройденных тестах и их покрытия исходного кода
- Release для создания релизных версий проектов и пуша их в удаленный репозиторий (github)
- Assembly для упаковки вашего приложения в архивы (jar)
- Dependency для скачивания всех зависимостей (и транзитивных тоже) в отдельные директории (так поступают многие другие Java приложения, такие как Apache Tomcat, Apache Maven, Gradle и др.)
Более того, мы сами попробуем написать свой собственный плагин и задеплоим его в репозиторий, чтобы предоставить доступ к нему из других приложений.
Узнаем в какие типы артефактов можно собирать наши проекты и конечно же более подробно остановимся на war (для упаковки веб архивов) и jar. А также узнаем, как собирать jar таким образом, чтобы можно было запустить наше приложение через командную строку, причем разберем несколько общепринятых вариантов.
Разберем многомодульные проекты, углубимся в возможности наследования конфигурационных файлов POM и многое другое.
По окончании курса вы уверенно будете владеть Apache Maven и хорошо разбираться во всех его аспектах.