«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. jar

Java-архив — или jar — один из самых популярных типов упаковки. Проекты с этим типом упаковки создают сжатый ZIP-файл с расширением .jar. Он может включать чистые классы Java, интерфейсы, ресурсы и файлы метаданных.

Для начала, давайте посмотрим на некоторые привязки по умолчанию к фазе сборки для jar: deploy: deploy

    Без промедления определим тип упаковки проекта jar:

Если ничего не указано, Maven предполагает, что тип упаковки — jar.

<packaging>jar</packaging>

2.2. war

Проще говоря, архив веб-приложения — или war — содержит все файлы, связанные с веб-приложением. Он может включать сервлеты Java, JSP, HTML-страницы, дескриптор развертывания и связанные ресурсы. В целом, у войны те же цели, что и у банки, но с одним исключением — фаза войны с пакетами имеет другую цель — войну.

Без сомнения, jar и war — самые популярные типы упаковки в сообществе Java. Подробная разница между этими двумя может быть интересным чтением.

Давайте определим тип упаковки веб-приложения:

Другие типы упаковки ejb, par и rar также имеют схожие жизненные циклы, но у каждого из них своя цель.

<packaging>war</packaging>

2.3. ear

ejb:<em>ejb</em> or par:<em>par</em> or rar:<em>rar</em>

Архив корпоративных приложений — или ear — представляет собой сжатый файл, содержащий приложение J2EE. Он состоит из одного или нескольких модулей, которые могут быть либо веб-модулями (упакованными в виде файла войны), либо модулями EJB (упакованными в виде файла jar), либо обоими из них.

Другими словами, ear представляет собой надмножество jars и wars и требует сервера приложений для запуска приложения, тогда как war требует только веб-контейнера или веб-сервера для его развертывания. Аспекты, отличающие веб-сервер от сервера приложений, и то, что представляют собой эти популярные серверы в Java, являются важными понятиями для Java-разработчика.

Давайте определим привязки целей по умолчанию для ear:

ear: generate-application-xml resources: resources ear: ear install: install deploy: deploy

    Вот как мы можем определить тип упаковки таких проектов:

2.4. pom

<packaging>ear</packaging>

Среди всех типов упаковки pom — самый простой. Это помогает создавать агрегаторы и родительские проекты.

Агрегатор или многомодульный проект собирает подмодули из разных источников. Эти подмодули являются обычными проектами Maven и следуют своим собственным жизненным циклам сборки. Агрегатор POM имеет все ссылки на подмодули в элементе modules.

«Родительский проект позволяет определить отношения наследования между POM. Родительский POM совместно использует определенные конфигурации, плагины и зависимости, а также их версии. Большинство элементов от родителя наследуются его дочерними элементами — исключения включают в себя ArtifexId, имя и предварительные условия.

Потому что нет ресурсов для обработки и нет кода для компиляции или тестирования. Следовательно, артефакты проектов pom генерируются сами, а не исполняемые файлы.

Определим тип упаковки многомодульного проекта:

Такие проекты имеют простейший жизненный цикл, состоящий всего из двух шагов: установка и развертывание.

<packaging>pom</packaging>

2.5. maven-plugin

Maven предлагает множество полезных плагинов. Однако могут быть случаи, когда плагинов по умолчанию недостаточно. В этом случае инструмент обеспечивает гибкость для создания maven-плагина в соответствии с потребностями проекта.

Чтобы создать плагин, установите тип упаковки проекта:

Жизненный цикл maven-plugin аналогичен жизненному циклу jar, но с двумя исключениями:

<packaging>maven-plugin</packaging>

plugin: descriptor isbound к плагину фазы генерации ресурсов: addPluginArtifactMetadata добавляется к фазе пакета

    Для этого типа проекта требуется зависимость maven-plugin-api.

2.6. ejb

Enterprise Java Beans — или ejb — помогает создавать масштабируемые распределенные серверные приложения. EJB часто обеспечивают бизнес-логику приложения. Типичная архитектура EJB состоит из трех компонентов: Enterprise Java Beans (EJB), контейнера EJB и сервера приложений.

Теперь давайте определим тип упаковки проекта EJB:

Тип упаковки ejb также имеет такой же жизненный цикл, что и упаковка jar, но с другой целью. Целью пакета для этого типа проекта является ejb:ejb.

<packaging>ejb</packaging>

Проекту с типом упаковки ejb требуется подключаемый модуль maven-ejb для выполнения целей жизненного цикла. Maven обеспечивает поддержку EJB 2 и 3. Если версия не указана, используется версия 2 по умолчанию.

2.7. rar

Адаптер ресурсов — или rar — это архивный файл, который служит допустимым форматом для развертывания адаптеров ресурсов на сервере приложений. По сути, это драйвер системного уровня, который соединяет приложение Java с корпоративной информационной системой (EIS).

Вот объявление типа упаковки для адаптера ресурсов:

Каждый архив адаптера ресурсов состоит из двух частей: файла jar, содержащего исходный код, и файла ra.xml, который служит дескриптором развертывания.

<packaging>rar</packaging>

Опять же, фазы жизненного цикла такие же, как у упаковки jar или war, за одним исключением: фаза упаковки выполняет цель rar, которая состоит из maven-rar-plugin для упаковки архивов.

3. Другие типы упаковки

До сих пор мы рассматривали различные типы упаковки, которые Maven предлагает по умолчанию. Теперь давайте представим, что мы хотим, чтобы наш проект создавал артефакт с расширением .zip. В этом случае типы упаковки по умолчанию нам не помогут.

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

msi rpm tar tar.bz2 tar.gz tbz zip

    Чтобы определить пользовательский тип, мы должны определить его тип упаковки и этапы его жизненного цикла. Для этого создайте файл component.xml в каталоге src/main/resources/META-INF/plexus:

До сих пор Maven ничего не знал о нашем новом типе упаковки и его жизненном цикле. Чтобы сделать его видимым, добавим плагин в pom-файл проекта и установим расширения в true:

<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.baeldung.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>

Теперь проект будет доступен для сканирования, и система будет искать плагины и compnenets.xml файл тоже.

<plugins>
    <plugin>
        <groupId>com.baeldung.maven.plugins</groupId>
        <artifactId>maven-zip-plugin</artifactId>
        <extensions>true</extensions>
    </plugin>
</plugins>

«Помимо всех этих типов, Maven предлагает множество других типов упаковки через внешние проекты и плагины. Например, nar (собственный архив), swf и swc — это типы упаковки для проектов, создающих содержимое Adobe Flash и Flex. Для таких проектов нам нужен плагин, определяющий индивидуальную упаковку, и репозиторий, содержащий плагин.

4. Заключение

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

Все примеры кода в Baeldung построены с использованием Maven. Обязательно ознакомьтесь с нашими различными конфигурациями Maven на GitHub.

«