MAVEN: what is pom.xml - Kovalevskyi-Academy/AcademyWiki GitHub Wiki

Заклинания для Maven

Документация тут: 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>

Простейший pom.xml

Для успешной сборки простейшего проекта достаточно:

  1. Открыть описание проекта.
  2. Указать версию super-pom.
  3. Указать groupId. Это адрес в мире Maven-программ.
  4. Указать artifactId. Это имя конкретного проекта (программы, модуля).
  5. Указать версию, которая растет по мере развития проекта.
  6. Закрыть описание проекта.

Вот как это выглядит в 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>

Дополнительные настройки в pom.xml

Любые дополнительные аспекты проекта (версия 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.

⚠️ **GitHub.com Fallback** ⚠️