MAVEN: what is pom.xml - Kovalevskyi-Academy/AcademyWiki GitHub Wiki
Документация тут: https://maven.apache.org/guides/introduction/introduction-to-the-pom.html
pom.xml
предназначен для декларирования различных аспектов жизни проекта.
pom-файлы могут быть родителями и наследниками, прям как классы в java. И свой вариант супер-предка
тут тоже есть, как класс Object
. Только называется он super-pom
. Он прячется в джарнике Мавена.
Но его можно
посмотреть на сайте (версия Мавена 3.8.3)
.
Как только вы задаете Мавену цель, он начинает ее выполнять, опираясь на
содержимое effective-pom.xml
. Это такой гибрид super-pom
и pom.xml
. Он генерируется
автоматически. Его можно глянуть с помощью команды: mvn help:effective-pom
Естественно мы должны выполнять условия .xml
.
В pom.xml
любые детали конфигурации заключаются в следующие блоки слов внутри угловатых скобок:
<имяНастройки>некий_параметр_настройки</имяНастройки>
<!--Вот так выглядит комментарий-->
<!-- Настройки могут быть вложенными:-->
<first>
<second>
<third>
<a>someValue</a>
<b>someValue</b>
</third>
</second>
</first>
Для успешной сборки простейшего проекта достаточно:
- Открыть описание проекта.
- Указать версию super-pom.
- Указать
groupId
. Это адрес в мире Maven-программ. - Указать
artifactId
. Это имя конкретного проекта (программы, модуля). - Указать версию, которая растет по мере развития проекта.
- Закрыть описание проекта.
Вот как это выглядит в pom.xml
:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.trololo.my.domain.name</groupId>
<artifactId>trololo-program</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
Любые дополнительные аспекты проекта (версия java, рабочие директории, кодировка исходников, подключаемые зависимости и пр.) описываются ниже упомянутой выше шапки.
Например, можно задать имя и описание проекта так:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.trololo.my.domain.name</groupId>
<artifactId>trololo-program</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MarketingName</name>
<description>
This is super-dupper program/freamwor/applet for something
</description>
</project>
3.0
Это были необязательные настройки. Но иногда нам нужно подправить что-то конкретное. Для этого нам
нужно задать это в пределах properties
:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.trololo.my.domain.name</groupId>
<artifactId>trololo-program</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MarketingName</name>
<description>
This is super-dupper program/freamwor/applet for something
</description>
<properties>
<!-- Создадим переменную, которую можно будет переиспользовать:-->
<java.version>17</java.version>
<!-- Задаем кодировку чтобы не сыпались warnings в зависимости от системы:-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- Кодировка исходников-->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- Кодировка bytecode-файлов-->
<!--Используем свою переменную. Задаем версию java для исходников и для bytecode-файлов-->
<maven.compiler.target>${java.version}</maven.compiler.target>
<maven.compiler.source>${java.version}</maven.compiler.source>
</properties>
</project>
В properties
можно задать кодировку исходников, версию java для исходников, версию для
скомпилированных файлов (версии исходников и байткода не обязаны совпадать!) и пр.
А что если нам нужно вмешаться в процесс сборки проекта?
Maven обрабатывает проект с помощью плагинов. Плагины это просто java-программы, как и сам Maven.
Особенности сборки проекта заключены в блоке build
. Обычно там поднастраивают различные параметры
плагинов.
Если плагин изначально есть в effective-pom
, то его можно просто упомянуть и задать настройки.
Выглядит это как-то так:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.trololo.my.domain.name</groupId>
<artifactId>trololo-program</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MarketingName</name>
<description>
This is super-dupper program/freamwor/applet for something
</description>
<properties>
<!-- Нам вдруг понадобился Maven именно версии 3.0-->
<mavenVersion>3.0</mavenVersion>
</properties>
<build>
<plugins>
<plugin>
<groupId>domain.name</groupId>
<artifactId>some-name-plugin</artifactId>
<version>3.0.0-M25</version>
<execution>
<!-- Можно явно задать к какой фазе жизненного цикла будет применен плагин, но не обязательно-->
<phase>test</phase>
</execution>
<configuration>
<!-- А это использование переменной, которая есть в Maven по умолчанию.-->
<configName1>${project.artifactId}</configName1>
<!-- Вот наша переменная и ее использование.-->
<configName1>${java.version}</configName1>
<!-- Какой-то параметр плагина-->
<configName1>false</configName1>
<descriptors>
<!-- Это очередная переменная, которая есть в Maven + путь к конкретным файлам.-->
<descriptor1>${project.basedir}/src/assembly/assembly.xml</descriptor1>
<descriptor2>${project.basedir}/otherPath.xml</descriptor2>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
Это выдуманный плагин. Но обратите внимание на использование переменных.
А если некого плагина нет в Maven по умолчанию, его нужно сначала подключить как зависимость в рамках dependencies
.
Выглядит это как-то так:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.trololo.my.domain.name</groupId>
<artifactId>trololo-program</artifactId>
<version>1.0-SNAPSHOT</version>
<name>MarketingName</name>
<description>
This is super-dupper program/freamwor/applet for something
</description>
<properties>
<!-- Нам вдруг понадобился Maven именно версии 3.0-->
<mavenVersion>3.0</mavenVersion>
</properties>
<build>
<plugins>
<plugin>
<groupId>domain.name</groupId>
<artifactId>other-plugin</artifactId>
<version>1.8.45</version>
<!-- Удалил настройки для краткости.-->
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>domain.name</groupId>
<artifactId>other-plugin</artifactId>
<version>1.8.45</version>
</dependency>
</dependencies>
</project>
То есть, мы чуть ниже блока build
в рамках dependencies
указали аж один плагин.
Maven автоматически загрузит зависимость из maven-репозитория и только потом начнет ее использовать.
Это касается любых зависимостей, что подключены в pom.xml
.