Что такое Maven? Управление сборкой и зависимостями для Java

Apache Maven - это краеугольный камень разработки Java и наиболее часто используемый инструмент управления сборкой для Java. Оптимизированная модель конфигурации Maven на основе XML позволяет разработчикам быстро описывать или понимать основные принципы любого проекта на основе Java, что упрощает запуск и совместное использование новых проектов. Maven также поддерживает разработку через тестирование, долгосрочное сопровождение проекта, а его декларативная конфигурация и широкий спектр плагинов делают его популярным вариантом для CI / CD. Эта статья представляет собой краткое введение в Maven, включая Maven POM и структуру каталогов, а также команды для создания вашего первого проекта Maven.

Обратите внимание, что самым последним выпуском Maven на момент написания этой статьи является Maven 3.6.3.

Maven против Ant и Gradle

Maven - не единственный инструмент сборки в экосистеме Java, хотя он самый популярный. В Ant, более раннем поколении инструмента конфигурации на основе XML, отсутствуют стандартизированные, основанные на соглашениях методы Maven и управление зависимостями, но он предлагает гибкость, которую вы не найдете в Maven. Gradle - это более новый инструмент, который работает поверх экосистемы Maven (с использованием репозиториев Maven), но поддерживает использование DSL на основе Groovy или Kotlin для настройки. Все три являются хорошими инструментами сборки сами по себе, и каждый может быть интегрирован в процесс CI / CD. Важно выбрать тот, который вам нужен, и знать, как его правильно использовать.

Как работает Maven

Как и многие отличные инструменты, Maven берет то, что когда-то было слишком сложным (ад конфигурации), и упрощает его до легко усваиваемых частей. Maven состоит из трех компонентов:

  • POM: файл, описывающий проект Maven и его зависимости.
  • Каталог: стандартизованный формат для описания проекта Maven в POM.
  • Репозитории: где хранится и обнаруживается стороннее программное обеспечение.

Maven POM : каждый проект Java, использующий Maven, имеет файл POM (объектной модели проекта) в корневом каталоге. Здесь pom.xmlописываются зависимости проекта и рассказывается, как его построить. ( Зависимости - это стороннее программное обеспечение, необходимое для проекта. Некоторые распространенные примеры - JUnit и JDBC. Список всех доступных инструментов и популярных зависимостей см. В Центральном репозитории Maven.)

Каталог Maven : каталог Maven реализует то, что известно как соглашение о конфигурации , элегантное решение ада конфигурации. Вместо того, чтобы требовать от разработчиков определения компоновки и ручной настройки компонентов для каждого нового проекта (как в случае с makefileAnt), Maven устанавливает общую структуру проекта и предлагает стандартный формат файла для описания того, как он работает. Вы просто вводите свои требования, а Maven вызывает зависимости и настраивает проект за вас.

Централизованные репозитории : наконец, Maven использует централизованные репозитории как для обнаружения, так и для публикации пакетов проектов в качестве зависимостей. Когда вы ссылаетесь на зависимость в своем проекте, Maven обнаружит ее в централизованном репозитории, загрузит в локальный репозиторий и установит в ваш проект. В большинстве случаев все это невидимо для вас как разработчика.

Доступ к зависимостям Maven

По умолчанию Maven разрешает зависимости из центрального репозитория Maven. Распространенной альтернативой является JCenter, который имеет более широкий набор доступных пакетов. Организации также публикуют и размещают внутренние репозитории, которые могут быть общедоступными или частными. Чтобы получить доступ к репозиторию, вы указываете его URL-адрес в Maven POM или можете указать Maven искать в других репозиториях.

Установка Maven

Maven - это проект Java, поэтому перед его установкой вам необходимо установить JDK в вашей среде разработки. (Подробнее о загрузке и установке JDK см. В разделе «Что такое JDK? Введение в Java Development Kit».)

После настройки среды разработки Java вы можете установить Maven всего за несколько шагов:

  1. Загрузите последний выпуск Maven (Maven 3.6.3 на момент написания этой статьи).
  2. Распакуйте apache.mavenфайл .zip в удобное место.
  3. Поместите этот файл на свой путь. Например, в системе Unix или Linux: экспорт PATH=$PATH:/home/maven/.

Теперь у вас должен быть доступ к mvnкоманде. Введите, mvn -vчтобы убедиться, что вы успешно установили Maven.

Maven POM

Корнем каждого проекта Maven является pom.xmlфайл. Несмотря на свою репутацию утомительного, XML на самом деле вполне подходит для этого варианта использования. POM Maven легко читается и раскрывает многое из того, что происходит в проекте. (Если вы работали с JavaScript, pom.xmlон по назначению аналогичен package.jsonфайлу Node NPM .)

В листинге 1 показан очень простой Maven pom.xml.

Листинг 1. Простой Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Понимание Maven POM

Как только вы освоитесь, POM не будет загадочным. Для начала вы можете просмотреть преамбулу XML, которая просто ссылается на официальную схему POM. Однако обратите внимание на XML, начинающийся с modelVersion. Это сообщает Maven, какую версию POM использовать, в данном случае Maven POM 4.0.0.

Далее, у вас есть groupId, artifactIdи version. Вместе эти три атрибута однозначно идентифицируют каждый управляемый Maven ресурс в репозитории. Эти атрибуты в верхней части файла описывают ваш проект Maven.

Теперь взгляните на dependenciesраздел POM, где мы описываем зависимости проекта. В этом случае мы пока задействовали только одну зависимость, JUnit. Обратите внимание , что JUnit также описывается в терминах его groupId, artifactIdи version.

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

Размещение вашего проекта в репозитории Maven

Имейте в виду, что POM определяет все, что нужно вашему проекту для запуска, но также описывает ваш проект как потенциальную зависимость. Если вы создаете проект, который будет зависимым - скажем, создаете библиотеку для использования другими проектами - вам нужно будет сделать его доступным одним из четырех способов:

  1. Сделайте его доступным локально.
  2. Публикация в удаленном репозитории, управляемом частным образом.
  3. Публикуйте в частном облачном репозитории.
  4. Публикуйте в общедоступном репозитории, таком как Maven Central.

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

Во втором случае вы используете размещенный репозиторий Maven, используя частный сервер для публикации и загрузки зависимостей. Для этого вам понадобится менеджер репозитория, например Apache Archiva.

Более новая альтернатива - использовать частное удаленное репо, но полагаться на облачный сервис для управления им, например Cloudsmith. Это дает преимущество удаленно размещенных зависимостей без необходимости установки сервера репо. Конечно, эта услуга платная.

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

  • Узнайте больше о размещении вашего проекта в репозитории Maven и получите список доступных репозиториев.
  • См. Официальную документацию Maven о подключаемом модуле выпуска Maven, используемом для подготовки программного обеспечения, опубликованного в репозитории Maven, и управления им.

Соберите пакет Maven

Если вы создадите pom.xmlиз листинга 1 и поместите его в каталог, вы сможете запускать для него команды Maven. В Maven есть множество команд, и многие из них доступны через плагин, но для начала вам нужно знать лишь несколько.

Для вашей первой команды попробуйте выполнить mvn package. Даже если у вас еще нет исходного кода, выполнение этой команды сообщает Maven о необходимости загрузки зависимости JUnit. Вы можете проверить вывод журнала Maven, чтобы убедиться, что зависимость загружена.

Область зависимости

Вы могли заметить, что зависимость JUnit в примере POM помечена как scope test. Область видимости - это важная концепция в управлении зависимостями, позволяющая вам определять и ограничивать способ вызова и использования каждой зависимости в вашем проекте. Область testдействия гарантирует, что зависимость доступна при запуске тестов, но не когда приложение упаковано для развертывания.

Другая распространенная область - это provided, которая сообщает платформе, что зависимость обеспечивается средой выполнения. Это часто наблюдается с сервлетами JARS при развертывании в контейнере сервлетов, поскольку контейнер предоставляет эти JARS. См. Документацию Apache Maven для получения полного списка областей зависимостей Maven.

Структура каталогов Maven

Когда команда будет выполнена, обратите внимание, что Maven создал /targetкаталог. Это стандартное место для вывода вашего проекта. В этом /targetкаталоге будут находиться загруженные вами зависимости вместе с артефактами скомпилированного приложения.

Затем вы хотите добавить файл Java, который вы поместите в src/каталог Maven . Создайте /src/main/java/com/javaworld/Hello.javaфайл с содержимым листинга 2.

Листинг 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

/srcПутем является стандартным местом для исходных файлов вашего проекта. Большинство проектов помещают свои основные файлы /src/main/внутрь, а файлы Java попадают в путь к классам в /java. Кроме того, если вы хотите включить ресурсы, не являющиеся кодом, например файлы конфигурации или изображения, вы можете использовать /src/main/resources. Активы по этому пути будут добавлены в основной путь к классам. Файлы тестов помещаются в /src/test/java.

Для обзора, вот некоторые ключевые части структуры проекта Maven (как это определено стандартной структурой каталогов Maven):

Ключевые части стандартной структуры каталогов Maven

pom.xml Файл дескриптора проекта
/ SRC / основной / Java Расположение исходных файлов
/ SRC / основные / ресурсы Расположение неисточниковых активов
/ SRC / тест / Java Расположение исходных файлов теста
/ цель Расположение вывода сборки

Управление вашим проектом Maven

Команда mvn packageуказывает Maven объединить проект. Выполните эту команду, когда будете готовы собрать все файлы проекта в одном месте. Напомним, что в файле POM для этого проекта мы установили тип упаковки jar, поэтому эта команда сообщает Maven, что нужно упаковать файлы приложения в JAR.

Maven предлагает множество дополнительных опций для управления тем, как управляется JAR, будь то толстый или тонкий JAR, и указания исполняемого файла mainclass. См. Документацию Maven, чтобы узнать больше об управлении файлами в Maven.

После объединения проекта вы, вероятно, захотите создать файл mvn install. Эта команда помещает проект в локальный репозиторий Maven. Попав в локальный репозиторий, он становится доступным для других проектов Maven в вашей локальной системе. Это полезно для сценариев разработки, когда вы и / или ваша команда создаете JAR-файлы зависимостей, которые еще не опубликованы в центральном репозитории.

Дополнительные команды Maven

Введите, mvn testкогда будете готовы запустить модульные тесты, которые вы определили в /src/java/testкаталоге.

Введите, mvn compileкогда будете готовы скомпилировать файлы классов проекта. Если вы запускаете установку горячего развертывания, эта команда запускает загрузчик классов горячего развертывания. (Инструмент горячего развертывания, такой как mvn spring-boot:runкоманда Spring Boot, будет следить за изменениями в файлах классов, а при компиляции исходные файлы будут скомпилированы, и запущенное приложение отразит эти изменения.)

Запуск нового проекта: Архетипы в Maven и Spring

Maven архетип представляет собой шаблон для запуска новых проектов , основанных на различных предопределенных настроек. Каждый архетип предлагает предварительно упакованные зависимости, например, для проекта веб-приложения Java EE или Java. Вы также можете создать новый архетип из существующего проекта, а затем использовать его для быстрого создания новых проектов на основе этих заранее определенных макетов. См. Документацию Maven, чтобы узнать больше об архетипах Apache Maven.

Инфраструктура Spring, которая хорошо работает с Maven, предлагает дополнительные сложные возможности для создания заглушек для новых проектов. Например, Spring Initializr - это инструмент, который позволяет очень быстро определять элементы, которые вы хотите использовать в новом приложении. По сути, Initializr не является архетипом Maven, но служит той же цели - генерации макета проекта на основе предварительных спецификаций. Из Initializr вы можете вводить mvn archetype:generateи просматривать варианты, чтобы найти архетип, подходящий для того, что вы создаете.

Добавление зависимостей