1. Обзор
Тип упаковки — важный аспект любого проекта Maven. Он определяет тип артефакта, создаваемого проектом. Как правило, сборка создает jar
, war
, pom
или другой исполняемый файл.
Maven предлагает множество типов упаковки по умолчанию, а также обеспечивает гибкость для определения пользовательского.
В этом руководстве мы подробно рассмотрим типы упаковки Maven. Сначала мы рассмотрим жизненные циклы сборки в Maven. Затем мы обсудим каждый тип упаковки, что они собой представляют и их влияние на жизненный цикл проекта. В конце мы увидим, как определить пользовательский тип упаковки.
2. Типы упаковки по умолчанию
Maven предлагает множество типов пакетов по умолчанию, включая jar
, war
, ear
, pom
, rar
, ejb
и maven-plugin
. Каждый тип упаковки следует жизненному циклу сборки, состоящему из этапов. Обычно каждый этап представляет собой последовательность целей и выполняет определенную задачу.
Различные типы упаковки могут иметь разные цели на определенном этапе. Например, на этапе упаковки типа упаковки jar
выполняется цель jar maven-jar-plugin .
И наоборот, для военного
проекта военная цель maven-war-plugin
выполняется на той же фазе.
2.1. банка
Архив Java — или jar
— один из самых популярных типов упаковки. Проекты с этим типом упаковки создают сжатый ZIP-файл с расширением .jar .
Он может включать чистые классы Java, интерфейсы, ресурсы и файлы метаданных.
Для начала давайте посмотрим на некоторые из стандартных привязок к фазе сборки для jar
:
- ресурсы:
ресурсы
- компилятор:
скомпилировать
- ресурсы:
testResources
- компилятор:
testCompile
- верный ответ:
тест
- банка:
банка
- установить:
установить
- развернуть:
развернуть
Без промедления определим тип упаковки jar
- проекта:
<packaging>jar</packaging>
Если ничего не указано, Maven предполагает, что тип упаковки — банка.
2.2. война
Проще говоря, архив веб-приложений — или war
— содержит все файлы, связанные с веб-приложением. Он может включать сервлеты Java, JSP, HTML-страницы, дескриптор развертывания и связанные ресурсы. В целом, война
имеет те же цели, что и jar
, но с одним исключением — пакетная фаза войны
имеет другую цель — войну
.
Без сомнения, jar
и war
— самые популярные типы пакетов в сообществе Java. Подробная разница между этими двумя может быть интересным чтением.
Определим тип упаковки веб-приложения:
<packaging>war</packaging>
Другие типы пакетов ejb
, par
и rar
также имеют схожие жизненные циклы, но у каждого из них своя цель.
ejb: ejb
или par: par
или rar: rar
2.3. ухо
Архив корпоративных приложений — или ear
— представляет собой сжатый файл, содержащий приложение J2EE. Он состоит из одного или нескольких модулей, которые могут быть либо веб-модулями (упакованными в виде файла войны
), либо модулями EJB (упакованными в виде файла jar
), либо обоими из них.
Другими словами, ear
представляет собой надмножество jars
и wars
и требует сервера приложений для запуска приложения, тогда как war
требует только веб-контейнера или веб-сервера для его развертывания. Аспекты, отличающие веб-сервер от сервера приложений, и то, что представляют собой эти популярные серверы в Java , являются важными понятиями для Java-разработчика.
Давайте определим привязки цели по умолчанию для уха
:
- ухо:
сгенерировать-приложение-xml
- ресурсы:
ресурсы
- ухо:
ухо
- установить:
установить
- развернуть:
развернуть
Вот как мы можем определить тип упаковки таких проектов:
<packaging>ear</packaging>
2.4. помпон
Среди всех видов упаковки помпон
— самый простой. Это помогает создавать агрегаторы и родительские проекты.
Агрегатор или многомодульный проект собирает подмодули из разных источников. Эти подмодули являются обычными проектами Maven и следуют своим собственным жизненным циклам сборки. Агрегатор POM имеет все ссылки на подмодули в элементе modules .
Родительский проект позволяет определить отношения наследования между POM. Родительский POM совместно использует определенные конфигурации, плагины и зависимости, а также их версии. Большинство элементов от родителя наследуются его дочерними элементами — исключения включают ArtiftId
, name
и Prepresives
.
Потому что нет ресурсов для обработки и нет кода для компиляции или тестирования. Следовательно, артефакты проектов pom генерируются сами по себе, а не исполняемые файлы.
Определим тип упаковки многомодульного проекта:
<packaging>pom</packaging>
У таких проектов самый простой жизненный цикл, состоящий всего из двух шагов: установка
и развертывание
.
2.5. maven-плагин
Maven предлагает множество полезных плагинов. Однако могут быть случаи, когда плагинов по умолчанию недостаточно. В этом случае инструмент обеспечивает гибкость создания maven-плагина в соответствии с потребностями проекта.
Для создания плагина задайте тип упаковки проекта:
<packaging>maven-plugin</packaging>
Жизненный цикл maven-plugin
аналогичен жизненному циклу jar
, но с двумя исключениями:
- плагин:
дескриптор
привязан к фазе генерации ресурсов - плагин:
addPluginArtifactMetadata
добавляется в фазу пакета
Для этого типа проекта требуется зависимость maven-plugin-api .
2.6. ejb
Enterprise Java Beans, или ejb
, помогает создавать масштабируемые распределенные серверные приложения. EJB часто обеспечивают бизнес-логику приложения. Типичная архитектура EJB состоит из трех компонентов: Enterprise Java Beans (EJB), контейнера EJB и сервера приложений.
Теперь давайте определим тип упаковки проекта EJB:
<packaging>ejb</packaging>
Тип упаковки ejb
также имеет аналогичный жизненный цикл упаковки jar , но с другой целью.
Целью пакета для этого типа проекта является ejb: ejb
.
Проекту с типом упаковки ejb
требуется подключаемый модуль maven-ejb
для выполнения целей жизненного цикла. Maven обеспечивает поддержку EJB 2 и 3. Если версия не указана, используется версия 2 по умолчанию.
2.7. рар
Адаптер ресурсов — или rar
— это файл архива, который служит допустимым форматом для развертывания адаптеров ресурсов на сервере приложений. По сути, это драйвер системного уровня, который соединяет приложение Java с корпоративной информационной системой (EIS).
Вот объявление типа упаковки для адаптера ресурсов:
<packaging>rar</packaging>
Каждый архив адаптера ресурсов состоит из двух частей: файла jar
, содержащего исходный код, и файла ra.xml
, который служит дескриптором развертывания.
Опять же, фазы жизненного цикла такие же, как у упаковки jar
или war
, за одним исключением: фаза упаковки
выполняет цель rar , состоящую из
maven-rar-plugin
для упаковки архивов .
3. Другие типы упаковки
До сих пор мы рассматривали различные типы упаковки, которые Maven предлагает по умолчанию. Теперь давайте представим, что мы хотим, чтобы наш проект создавал артефакт с расширением .zip .
В этом случае типы упаковки по умолчанию нам не помогут.
Maven также предоставляет несколько дополнительных типов упаковки через плагины. С помощью этих плагинов мы можем определить собственный тип упаковки и жизненный цикл ее сборки. Вот некоторые из этих типов:
мси
об/мин
смола
tar.bz2
tar.gz
тбз
молния
Чтобы определить пользовательский тип, мы должны определить его тип
упаковки
и этапы
его жизненного цикла .
Для этого создайте файл component.xml в каталоге
src/main/resources/META-INF/plexus
:
``
<component>
<role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
<role-hint>zip</role-hint>
<implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
<configuration>
<phases>
<process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
<package>com.foreach.maven.plugins:maven-zip-plugin:zip</package>
<install>org.apache.maven.plugins:maven-install-plugin:install</install>
<deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
</phases>
</configuration>
</component>
До сих пор Maven ничего не знает о нашем новом типе упаковки и ее жизненном цикле. Чтобы сделать его видимым, давайте добавим плагин в файл pom
проекта и установим расширения
в true
:
<plugins>
<plugin>
<groupId>com.foreach.maven.plugins</groupId>
<artifactId>maven-zip-plugin</artifactId>
<extensions>true</extensions>
</plugin>
</plugins>
Теперь проект будет доступен для сканирования, а также система просмотрит плагины
и файл component.xml .
Помимо всех этих типов, Maven предлагает множество других типов упаковки через внешние проекты и плагины. Например, nar
(собственный архив), swf
и swc
— это типы упаковки для проектов, создающих содержимое Adobe Flash и Flex. Для таких проектов нам нужен плагин, определяющий индивидуальную упаковку, и репозиторий, содержащий плагин.
4. Вывод
В этой статье мы рассмотрели различные типы пакетов, доступные в Maven. Кроме того, мы познакомились с тем, что представляют собой эти типы и чем они отличаются по своим жизненным циклам. В конце концов, мы также узнали, как определить собственный тип упаковки и настроить жизненный цикл сборки по умолчанию.
Все примеры кода в ForEach построены с использованием Maven. Обязательно ознакомьтесь с нашими различными конфигурациями Maven на GitHub .