Maven - это инструмент автоматизации сборки , используемый в основном для проектов Java . Maven также можно использовать для создания и управления проектами, написанными на C # , Ruby , Scala и других языках. Проект Maven поддерживается Apache Software Foundation , где он ранее был частью проекта Jakarta .
Разработчики) | Фонд программного обеспечения Apache |
---|---|
Первый выпуск | 13 июля 2004 г . |
Стабильный выпуск | 3.8.1 / 4 апреля 2021 г . [1] |
Репозиторий | Репозиторий Maven |
Написано в | Ява |
Тип | Инструмент сборки |
Лицензия | Лицензия Apache 2.0 |
Веб-сайт | maven |
Maven адрес два аспектом построения программного обеспечения: как это программное обеспечение встроенные и его зависимости. В отличие от более ранних инструментов, таких как Apache Ant , он использует соглашения для процедуры сборки, и нужно записывать только исключения. XML - файл описывает программное обеспечение проекта строится, его зависимости от других внешних модулей и компонентов, порядок сборки, каталогов и необходимых плагинов . Он поставляется с заранее определенными целями для выполнения определенных четко определенных задач, таких как компиляция кода и его упаковка. Maven динамически загружает библиотеки Java и плагины Maven из одного или нескольких репозиториев, таких как центральный репозиторий Maven 2, и сохраняет их в локальном кэше. [2] Этот локальный кеш загруженных артефактов также может быть обновлен артефактами, созданными локальными проектами. Публичные репозитории также могут быть обновлены.
Maven построен с использованием архитектуры на основе плагинов, которая позволяет использовать любое приложение, управляемое через стандартный ввод. Для Maven 2 поддерживается собственный подключаемый модуль C / C ++ [3]
Альтернативные технологии, такие как Gradle и sbt, в качестве инструментов сборки не полагаются на XML , но сохраняют ключевые концепции, представленные Maven. Вместе с Apache Ivy был разработан специальный менеджер зависимостей, который также поддерживает репозитории Maven. [4]
Apache Maven поддерживает воспроизводимые сборки . [5] [6]
История
Maven, созданный Джейсоном ван Зилом, начинался как подпроект Apache Turbine в 2002 году. В 2003 году он был принят на голосование и признан проектом Apache Software Foundation высшего уровня . В июле 2004 года выпуск Maven стал первой важной вехой - v1.0. Версия 2.0 для Maven 2 была объявлена в октябре 2005 г. после шести месяцев бета-тестирования. Maven 3.0 был выпущен в октябре 2010 года и в основном обратно совместим с Maven 2.
Информация о Maven 3.0 начала просачиваться в 2008 году. После восьми альфа-релизов первая бета-версия Maven 3.0 была выпущена в апреле 2010 года. В Maven 3.0 была переработана основная инфраструктура Project Builder, в результате чего файловое представление POM было отделено от его входящей информации. представление объекта памяти. Это расширило возможность надстроек Maven 3.0 использовать файлы определения проекта, не основанные на XML. Предлагаемые языки включают Ruby (уже в частном прототипе Джейсона ван Зила), YAML и Groovy .
Особое внимание было уделено обеспечению обратной совместимости Maven 3 с Maven 2. Для большинства проектов обновление до Maven 3 не потребует каких-либо корректировок их структуры проекта. В первой бета-версии Maven 3 была представлена функция параллельной сборки, которая использует настраиваемое количество ядер на многоядерной машине и особенно подходит для крупных многомодульных проектов.
Синтаксис
Проекты Maven настраиваются с использованием объектной модели проекта , которая хранится в файле pom.xml
. Пример файла выглядит так:
4.0.0 com.mycompany.app my-app 1.0 junit junit 3.8.1 test
Этот POM определяет только уникальный идентификатор проекта ( координаты ) и его зависимость от платформы JUnit . Однако этого уже достаточно для создания проекта и выполнения связанных с ним модульных тестов . Maven достигает этого, принимая идею соглашения по конфигурации , то есть Maven предоставляет значения по умолчанию для конфигурации проекта.
Структура каталогов обычного идиоматического проекта Maven имеет следующие записи каталогов:
Имя каталога | Цель |
---|---|
проект дома | Содержит pom.xml и все подкаталоги. |
SRC / основной / Java | Содержит поставляемый исходный код Java для проекта. |
SRC / основные / ресурсы | Содержит доставляемые ресурсы для проекта, например файлы свойств. |
SRC / тест / Java | Содержит тестовый исходный код Java (например, тестовые примеры JUnit или TestNG) для проекта. |
SRC / тест / ресурсы | Содержит ресурсы, необходимые для тестирования. |
Команда mvn package
скомпилирует все файлы Java, запустит все тесты и упакует поставляемый код и ресурсы target/my-app-1.0.jar
(при условии, что artifactId - это my-app, а версия - 1.0).
Используя Maven, пользователь предоставляет только конфигурацию для проекта, в то время как настраиваемые плагины выполняют фактическую работу по компиляции проекта, очистке целевых каталогов, запуску модульных тестов, созданию документации API и т. Д. В общем, пользователям не нужно писать плагины самостоятельно. Сравните это с Ant и make , в котором написаны императивные процедуры для выполнения вышеупомянутых задач.
Дизайн
Объектная модель проекта
Объектная модель проекта (POM) предоставляет всю конфигурацию для одного проекта. Общая конфигурация охватывает имя проекта, его владельца и его зависимости от других проектов. Также можно настроить отдельные фазы процесса сборки, которые реализованы в виде плагинов . Например, можно настроить подключаемый модуль компилятора для использования Java версии 1.5 для компиляции или указать упаковку проекта, даже если некоторые модульные тесты завершились неудачно.
Более крупные проекты следует разделить на несколько модулей или подпроектов, каждый со своим собственным POM. Затем можно написать корневой POM, через который можно скомпилировать все модули с помощью одной команды. POM также могут наследовать конфигурацию от других POM. По умолчанию все POM наследуются от Super POM [7] . Super POM предоставляет конфигурацию по умолчанию, такую как исходные каталоги по умолчанию, плагины по умолчанию и так далее.
Плагины
Большая часть функциональности Maven находится в надстройках . Плагин предоставляет набор целей, которые можно выполнить с помощью команды mvn [plugin-name]:[goal-name]
. Например, проект Java можно скомпилировать с помощью compile-goal [8] подключаемого модуля компилятора , запустив mvn compiler:compile
.
Существуют плагины Maven для сборки, тестирования, управления исходным кодом, запуска веб-сервера, создания файлов проекта Eclipse и многого другого. [9] Плагины вводятся и настраиваются в разделе pom.xml
файла. Некоторые базовые плагины включены в каждый проект по умолчанию и имеют разумные настройки по умолчанию.
Однако было бы обременительно, если бы типичная последовательность сборки, состоящая из сборки, тестирования и упаковки программного проекта, требовала выполнения каждой соответствующей цели вручную:
mvn compiler:compile
mvn surefire:test
mvn jar:jar
Концепция жизненного цикла Maven решает эту проблему.
Плагины - это основной способ расширения Maven. Разработку подключаемого модуля Maven можно выполнить путем расширения класса org.apache.maven.plugin.AbstractMojo. Пример кода и объяснение плагина Maven для создания облачной виртуальной машины с сервером приложений приведены в статье Автоматизация разработки облачных виртуальных машин и управления ими . [10]
Строить жизненные циклы
Жизненный цикл сборки - это список именованных фаз, которые можно использовать для упорядочивания выполнения цели. Один из стандартных жизненных циклов Maven - это жизненный цикл по умолчанию , который включает в себя следующие фазы в следующем порядке: [11]
- подтверждать
- генерировать источники
- процессы-источники
- генерировать ресурсы
- процесс-ресурсы
- компилировать
- Источники-тесты-процессы
- процесс-тест-ресурсы
- тестовая компиляция
- контрольная работа
- упаковка
- установить
- развертывать
Цели, предоставляемые плагинами, могут быть связаны с разными фазами жизненного цикла. Например, по умолчанию цель «компилятор: компиляция» связана с фазой «компиляция», а цель «surefire: test» связана с фазой «тест». Когда mvn test
команда выполняется, Maven выполняет все цели, связанные с каждой из фаз, вплоть до фазы «тестирования». В таком случае Maven выполняет цель «ресурсы: ресурсы», связанную с фазой «процесс-ресурсы», затем «компилятор: компиляция» и так далее, пока, наконец, не выполнит цель «уверенный: проверка».
В Maven также есть стандартные этапы очистки проекта и создания сайта проекта. Если бы очистка была частью жизненного цикла по умолчанию, проект очищался бы каждый раз при его построении. Это явно нежелательно, поэтому очистка получила отдельный жизненный цикл.
Стандартные жизненные циклы позволяют пользователям, не знакомым с проектом, точно создавать, тестировать и устанавливать каждый проект Maven с помощью одной команды mvn install
. По умолчанию Maven упаковывает файл POM в сгенерированные файлы JAR и WAR. Такие инструменты, как diet4j [12], могут использовать эту информацию для рекурсивного разрешения и запуска модулей Maven во время выполнения, не требуя "uber" -jar, который содержит весь код проекта.
Зависимости
Центральная функция Maven - это управление зависимостями . Механизм обработки зависимостей Maven организован вокруг системы координат, идентифицирующей отдельные артефакты, такие как программные библиотеки или модули. В приведенном выше примере POM координаты JUnit упоминаются как прямая зависимость проекта. Проект, которому требуется, скажем, библиотека Hibernate, просто должен объявить координаты проекта Hibernate в своем POM. Maven автоматически загрузит зависимость и зависимости, которые нужны самому Hibernate (так называемые транзитивные зависимости), и сохранит их в локальном репозитории пользователя. Центральный репозиторий Maven 2 [2] по умолчанию используется для поиска библиотек, но можно настроить репозитории, которые будут использоваться (например, частные репозитории компании) в POM.
Фундаментальное различие между Maven и Ant заключается в том, что дизайн Maven рассматривает все проекты как имеющие определенную структуру и набор поддерживаемых рабочих потоков задач (например, получение ресурсов из системы контроля версий, компиляция проекта, модульное тестирование и т. Д.). Хотя большинство программных проектов фактически поддерживают эти операции и имеют четко определенную структуру, Maven требует, чтобы эта структура и детали реализации операции были определены в файле POM. Таким образом, Maven полагается на соглашение о том, как определять проекты, и на список рабочих потоков, которые обычно поддерживаются во всех проектах. [13]
Существуют поисковые системы, такие как The Central Repository Search Engine [14], которые можно использовать для определения координат различных библиотек и фреймворков с открытым исходным кодом.
Проекты, разработанные на одной машине, могут зависеть друг от друга через локальный репозиторий. Локальный репозиторий - это простая структура папок, которая действует как кеш для загруженных зависимостей, так и как централизованное хранилище для локально созданных артефактов. Команда Maven mvn install
создает проект и помещает его двоичные файлы в локальный репозиторий. Затем другие проекты могут использовать этот проект, указав его координаты в своих POM.
Совместимость
Существуют надстройки к нескольким популярным интегрированным средам разработки, ориентированным на язык программирования Java, чтобы обеспечить интеграцию Maven с механизмом сборки IDE и инструментами редактирования исходного кода, что позволяет Maven компилировать проекты из среды IDE, а также устанавливать путь к классам для завершения кода, выделение ошибок компилятора и т. д. Примеры популярных IDE, поддерживающих разработку с Maven, включают:
- Затмение
- NetBeans
- IntelliJ IDEA
- JBuilder
- JDeveloper (версия 11.1.2)
- MyEclipse
- Код Visual Studio
Эти надстройки также предоставляют возможность редактировать POM или использовать POM для определения полного набора зависимостей проекта непосредственно в среде IDE.
Некоторые встроенные функции IDE утрачиваются, когда IDE больше не выполняет компиляцию. Например, JDT Eclipse имеет возможность перекомпилировать один исходный файл Java после того, как он был отредактирован. Многие IDE работают с плоским набором проектов вместо иерархии папок, предпочитаемой Maven. Это усложняет использование систем SCM в IDE при использовании Maven. [15] [16] [17]
Смотрите также
- Apache Continuum
- Apache Jelly
- Hudson
- Дженкинс
- Список программного обеспечения для автоматизации сборки
Рекомендации
- ^ «Примечания к выпуску Maven - Maven 3.8.1» . maven.apache.org .
- ^ а б "Индекс / maven2 /" . Архивировано из оригинала на 2018-09-17 . Проверено 15 апреля 2009 .
- ^ Лаугстол, Трюгве. «Плагин MojoHaus Native Maven» .
- ^ "IBiblio Resolver | Apache Ivy ™" .
- ^ «Воспроизводимые / проверяемые сборки - Apache Maven - Apache Software Foundation» . cwiki.apache.org .
- ^ «Воспроизводимые сборки на Java - DZone Java» . dzone.com .
- ^ Супер ПОМ
- ^ Пунзалан, Эдвин. «Плагин компилятора Apache Maven - Введение» .
- ^ Марбез, Бретт Портер, Джейсон ван Зил, Деннис Лундберг, Оливье, Лами, Бенсон, Маргулис Карл-Хайнц. «Maven - Доступные плагины» .
- ^ Эмис, Алекс; Zou PX; Ван И С. (29 октября 2011 г.). «Автоматизация разработки и управления облачными виртуальными машинами» . IBM DeveloperWorks . IBM.
- ^ Портер, Бретт. «Maven - Введение в жизненный цикл сборки» .
- ^ "diet4j - положите Java JAR на диету и загрузите модули maven по мере необходимости" .
- ^ «Maven: полный справочник» . Сонатип. Архивировано из оригинального 21 апреля 2013 года . Проверено 11 апреля 2013 года .
- ^ Центральная поисковая система репозитория ,
- ^ "maven.apache.org/eclipse-plugin.html" . Архивировано из оригинала 7 мая 2015 года.
- ^ «IntelliJ IDEA :: Возможности» .
- ^ «MavenBestPractices - NetBeans Wiki» .
дальнейшее чтение
- О'Брайен, Тим; и другие. «Maven: полный справочник» . Sonatype.com . Сонатип . Проверено 15 марта 2013 года .
- Maven: полное руководство . Компания Sonatype. O'Reilly Media, Inc. 2009. стр. 470. ISBN 9780596551780. Проверено 17 апреля 2013 .CS1 maint: другие ( ссылка )
- Ван Зил, Джейсон (01.10.2008), Maven: Definitive Guide (первое издание), O'Reilly Media , стр. 468 , ISBN 978-0-596-51733-5
- «Запуск тестов JUnit из Maven2». JUnit в действии (2-е изд.). Публикации Мэннинга . 2011. С. 152–168. ISBN 978-1-935182-02-3.
- Настройка сборки Maven . Packt. 2013. С. 1–250. ISBN 9781783987221.
- Освоение Apache Maven 3 . Packt. 2014. с. 298. ISBN 9781783983865.
Внешние ссылки
- Официальный веб-сайт