Вакансия: младший Java программист
Небольшой компании разработчику ПО
требуется младший Java программист
Москва, м. Партизанская/ МЦК Окружная подробнее






Клуб Java разработчиков
Обсуждение интересных технологий
и новинок для Java разработчиков.
Москва, м. Партизанская подробнее






Что такое pom.xml

pom.xml - это основной файл, который описывает проект. Вообще могут быть дополнительные файлы, но они играют второстепенную роль.

Давайте разберём из чего состоит файл pom.xml

Корневой элемент и заголовок.

            
<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">
  <modelVersion>4.0.0</modelVersion>
  .............
</project>
  
                
Корневой элемент <project>, схема, которая облегчает редактирование и проверку, и версия POM.

Внутри тэга project содержится основная и обязательная информация о проекте:


  <!-- The Basics -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>

   
В Maven каждый проект идентифицируется парой groupId artifactId. Во избежание конфликта имён, groupId - наименование организации или подразделения и обычно действуют такие же правила как и при именовании пакетов в Java - записывают доменное имя организации или сайта проекта. artifactId - название проекта. Внутри тэга version, как можно догадаться хранится версия проекта. Тройкой groupId, artifactId, version (далее - GAV) можно однозначно идентифицировать jar файл приложения или библиотеки. Если состояние кода для проекта не зафиксировано, то в конце к имени версии добавляется "-SNAPSHOT" что обозначает, что версия в разработке и результирующий jar файл может меняться. <packaging>...</packaging> определяет какого типа файл будет создаваться как результат сборки. Возможные варианты pom, jar, war, ear

Давайте лучше рассмотрим на примере проекта powermock-core groupId - org.powermock, artifactId - powermock-core , version - 1.4.6

Также добавляется информация, которая не используется самим мавеном, но нужна для программиста, чтобы понять, о чём этот проект:

  • <name>powermock-core</name> название проекта для человека
  • <description>PowerMock core functionality.</description> Описание проекта
  • <url>http://www.powermock.org</url> сайт проекта.

Зависимости

Зависимости - следующая очень важная часть pom.xml - тут хранится список всех библиотек (зависимостей) которые используюся в проекте. Каждая библиотека идентифицируется также как и сам проект - тройкой groupId, artifactId, version (GAV). Объявление зависимостей заключено в тэг <dependencies>...</dependencies>.

                    
                <dependencies>
                        <dependency>
                            <groupId>junit</groupId>
                            <artifactId>junit</artifactId>
                            <version>4.4</version>
                            <scope>test</scope>
                        </dependency>
                        <dependency>
                            <groupId>org.powermock</groupId>
                            <artifactId>powermock-reflect</artifactId>
                            <version>${version}</version>
                        </dependency>
                        <dependency>
                            <groupId>org.javassist</groupId>
                            <artifactId>javassist</artifactId>
                            <version>3.13.0-GA</version>
                            <scope>compile</scope>
                        </dependency>
                    </dependencies>

                

                

Как вы могли заметить, кроме GAV при описании зависимости может присутствовать тэг <scope>. Scope задаёт, для чего библиотека используется. В данном примере говорится, что библиотека с GAV junit:junit:4.4 нужна только для выполнения тестов.

Тэг <build>

Тэг <build> не обязательный, т. к. существуют значения по умолчанию. Этот раздел содержит информацию по самой сборке: где находятся исходные файлы, где ресурсы, какие плагины используются. Например:

          
         <build>
         <outputDirectory>target2</outputDirectory>
          <finalName>ROOT</finalName>
         <sourceDirectory>src/java</sourceDirectory>
            <resources>
                <resource>
                    <directory>${basedir}/src/java</directory>
                    <includes>
                    <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-pmd-plugin</artifactId>
                         <version>2.4</version>
                     </plugin>
                 </plugins>
             </build>
                    
   

Давайте рассмотрим этот пример более подробно.

  • <sourceDirectory>
  • определяет, откуда maven будет брать файлы исходного кода. По умолчанию это src/main/java, но вы можете определить, где это вам удобно. Директория может быть только одна (без использования специальных плагинов)
  • <resources>
  • и вложенные в неё тэги <resource> определяют, одну или несколько директорий, где хранятся файлы ресурсов. Ресурсы в отличие от файлов исходного кода при сборке просто копируются . Директория по умолчанию src/main/resources
  • <outputDirectory>
  • определяет, в какую директорию компилятор будет сохранять результаты компиляции - *.class файлы. Значение по умолчанию - target/classes
  • <finalName>
  • - имя результирующего jar (war, ear..) файла с соответствующим типу расширением, который создаётся на фазе package. Значение по умолчанию — artifactId-version.
Maven плагины позволяют задать дополнительные действия, которые будут выполняться при сборке. Например в приведённом примере добавлен плагин, который автоматически делает проверку кода на наличие "плохого" кода и потенциальных ошибок. См ссылка.

Читайте более подробнее о плагинах







blog comments powered by Disqus