1. Обзор
В этом коротком руководстве мы рассмотрим различия между супер, простейшим и эффективным POM с использованием Maven .
2. Что такое ПОМ?
POM
означает объектную модель проекта
и является ядром конфигурации проекта в Maven. Это единый XML-файл конфигурации с именем pom.xml
, который содержит большую часть информации, необходимой для создания проекта.
Роль файла POM
заключается в описании проекта, управлении зависимостями и объявлении сведений о конфигурации, которые помогают Maven построить проект.
3. Супер ПОМ
Чтобы легче понять супер POM, мы можем провести аналогию с классом Object
из Java: каждый класс из Java по умолчанию расширяет класс Object
. Точно так же в случае POM каждый POM расширяет суперPOM.
**Файл super POM определяет все конфигурации по умолчанию. Следовательно, даже самая простая форма файла POM наследует все конфигурации, определенные в файле super POM.**
В зависимости от версии Maven, которую мы используем, super POM может выглядеть немного иначе. Например, если на нашем компьютере установлен Maven, мы можем визуализировать его в файле ${M2_HOME}/lib
, maven-model-builder-<версия>.jar
. Если мы откроем этот файл JAR, мы найдем его под именем org/apache/maven/model/pom-4.0.0.xml
.
В следующих разделах мы рассмотрим элементы конфигурации super POM для версии 3.6.3.
3.1. Репозитории
Maven использует репозитории, определенные в разделе репозиториев
, для загрузки всех зависимых артефактов во время сборки Maven.
Давайте рассмотрим пример:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
3.2. Репозитории плагинов
Репозиторий плагинов по умолчанию — это центральный репозиторий Maven. Давайте посмотрим, как это определено в разделе pluginRepository
:
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
Как мы видим выше, моментальные снимки отключены, а для updatePolicy
установлено значение « никогда
». Следовательно, с этой конфигурацией Maven никогда не будет автоматически обновлять плагин, если выпущена новая версия.
3.3. Строить
Раздел конфигурации сборки
содержит всю информацию, необходимую для сборки проекта.
Давайте посмотрим на пример раздела сборки по умолчанию:
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict
with lifecycle mappings (MNG-4453) -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</pluginManagement>
</build>
3.4. Составление отчетов
Для отчетов
супер POM предоставляет только значение по умолчанию для выходного каталога:
<reporting>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>
3.5. Профили
Если у нас нет определенных профилей
на уровне приложения, будет выполнен профиль сборки по умолчанию.
Раздел профилей
по умолчанию выглядит так:
<profiles>
<!-- NOTE: The release profile will be removed from future versions of the super POM -->
<profile>
<id>release-profile</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
4. Простейший ПОМ
Самый простой POM — это POM, который вы объявляете в своем проекте Maven. Чтобы объявить POM, вам нужно будет указать как минимум эти четыре элемента: modelVersion
, groupId
, ArtiftId
и version
. Самый простой POM унаследует все конфигурации от супер POM .
Давайте посмотрим на минимально необходимые элементы для проекта Maven:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.foreach</groupId>
<artifactId>maven-pom-types</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
Одним из основных преимуществ иерархии POM в Maven является то, что мы можем расширять и переопределять конфигурацию, унаследованную сверху. Следовательно, чтобы переопределить конфигурацию данного элемента или артефакта в иерархии POM, Maven должен иметь возможность однозначно идентифицировать соответствующий артефакт.
5. Эффективный ПОМ
Эффективный POM сочетает в себе все настройки по умолчанию из суперфайла POM и конфигурацию, определенную в POM нашего приложения. Maven использует значения по умолчанию для элементов конфигурации, если они не переопределены в приложении pom.xml
. Следовательно, если мы возьмем тот же образец POM-файла из самого простого раздела POM, мы увидим, что эффективный POM-файл будет представлять собой слияние между простейшим и супер-POM. Мы можем визуализировать это из командной строки:
mvn help:effective-pom
Это также лучший способ увидеть значения по умолчанию, которые использует Maven.
6. Заключение
В этом кратком руководстве мы обсудили различия между объектными моделями проекта
в Maven.
Как всегда, пример, показанный в этом руководстве, доступен на GitHub .