POM-ни о POM Часть 1

Введение

В самом узком смысле, maven, это сборщик проекта, который хранит всю конфигурацию в xml файле - pom.xml На первый взгляд, файл может показаться громоздким и непонятным. Но это только на первый взгляд. В этой статье, постараемся поэтапно разъяснить назначения каждого поля.

Начало

Собственно как и любой xml pom.xml начинается с известного тега xml, который оговаривает версию и кодировку файла. Вобщем стандарный тег для всех.


<?xml version="1.0" encoding="UTF-8"?>

Далее, начинается описание проекта


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

Тут нас интересует два момента. Первое это собственно сам тег project с которого начинается все действо, второе это версия. На момент написания статьи это 4.0.0.

Эта же версия указывается в следующем дочернем теге modelVersion 4.0.0. Стоит заметить, этот тег обязателен. Он же будет следовать следующим за открытым тегом project

Проект

Описание проект начинается с указания группы. Делается это тегом groupId.

 


<groupId>ru.javase</groupId>

Имя группы не нужно путать с пакетом в котором хранится наш проект. Это просто идентификация модуля.

Имя проекта прописывается в теге artifactId.

 


<artifactId>javase</artifactId>

Этот тег используется для именования собранного модуля. В данном случае, наш модуль называется javase. Он же может быть использован для наследования, если таковое присутствует.

Версия пакета указывается в теге version.


<version>1.0</version>

Всё вместе определит имя пакета javase-1.0 Собственно это основные настройки для maven. Но это ещё не всё, что должно знать об этих параметрах. Если наш проект будет использоваться как репозиторий, то в директории .m2 maven создаст соответствующую структуру подкаталогов, которое примет следующую иерархию: .m2/ru/javase/javase/1.0 В котором будет находится jar файл нашего проекта в репозитории.

Следующим тегом является packaging, упаковка. В каком формате мы хотим представить наш проект. В большинстве случаев используются следующие типы: pom, war, jar, era, ejb. По умолчанию maven будет упаковывать проект в jar архив, а следовательно этот тег является необязательным.


<packaging>war</packaging>

В конкретном случае мы заставляем maven собрать для нас war архив.

Для именования проекта используется тег name. Это имя в дальнейшем может быть использовано в наследовании. Допустим:


<name>my-jar</name>

Зависимости

Практически в любой программе на языке java используются сторонние пакеты в которых может содержаться дополнительный функционал, который используется в нашем проекте. Для того, чтобы указать зависимости для нашего проекта, используется тег dependencies, который в свою очередь содержит перечисление всех зависимостей для проекта. Так, в дочернем теге dependency будет определено какую именно зависимость мы планируем получить. Для примера JUnit зависимость будет выглядеть примерно так.


<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Тут мы подключили зависимость JUnit, тем самым заставили maven проверить, существует ли этот пакет в локальном репозироии или нет, если такового пакета не существует, он будет скачан с официального репозитория https://repo.maven.apache.org/maven2 и соэранён в локальном репозитории. При следующей сборке, данный покет скачан уже не будет, так как содержится в локальном репозитории.

В данном примере мы используем вовый тег scope, который определяет область применения зависимости. Существует их всего 4: compile, runtime, test, system Compile область по умолчанию. Говорит о том, что данная зависимость необходима во время компиляции и не стоит забывать подключать её при компилировании пакета.

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

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

System определяет, что данный пакет всегда доступен. jar файл должен быть подключён явно. Т.е. он не содержится в репозитории. В частности должен быть указан тег systemPath

Наследие

В крупных проектах на java существует множество связанных модулей, допустим для сборки проекта EAR могут быть использованы модули jar, war и т.д. Чтобы всё это собрать воедино, требуется некоторая последовательность действий, в том чисте и наследование. Допустим, мы собираем EAR проект, который зависит от компиляции JAR и WAR. Следовательно, мы должны выполнить компиляцию JAR, затем WAR и уже после этого собрать проект в EAR. Так, тег parent будет использован в наследниках, в данном случае JAR и WAR которые будут наследовать свойства родительского элемента EAR

В родительском проекте EAR для указания зависимых модулей используется тег modules с дочерними элементами module. Например:


<modules>
    <module>my-jar</module>
    <module>my-war</module>
</modules>

В дочерних проектах:


<parent>
    <groupId>ru.javase</groupId>
    <artifactId>my-jar</artifactId>
    <version>1.0</version>
</parent>

Если же наши модули используют собсвенные модули, то следует указать соответствующую зависимость:


<dependency>
    <groupId>ru.javase</groupId>
    <artifactId>my-jar</artifactId>
    <version>1.0</version>
    <type>jar</type>
</dependency>

xml maven
© JavaSE.ru