Maven и java

maven java

Сегодня попытаемся понять какую роль играет сборщик приложений maven в java, как он работает и как правильно с ним работать. И конечно же напишем с ним простой пример.

В период изучения программирования наступает момент, когда нужно выйти за рамки разработки простого приложения и начать разрабатывать большие и сложные системы. Стандартного функционала java уже не достаточно и нужно использовать сторонние библиотеки и фреймворки. В такие моменты и нужен maven.

Немного истории для самых познавательных. Когда не было сборщиков проектов — программисты просто качали нужные им библиотеки и подключали их к своему проекту. Проще говоря — брали файл и помещали его в папку своего проекта.

Со временем стало понятно, что делать это не всегда удобно. Да и следить за версиями библиотек очень не просто. Библиотека, которую вы скачали и подключили могла получить обновление и для того, чтобы обновить ее в проекте приходилось качать ее новую версию, удалять старую версию со своего проекта, подключать новую. А если у Вас проект — банковская система, над которой трудятся одновременно 50 программистов — то такой расклад и вовсе выглядел печальным.

Тогда и пришли на помощь сборщики проектов. Больше не нужно было качать и подключать. Достаточно было указать ссылку на библиотеку, ее версию и собрать проект.

Первый сборщик, который я помню и которым даже пользовался был Ant. Его все еще можно увидеть в старых проектах в некоторых компаниях. Если честно, я толком не знаком с ним. Просто довелось немного поработать с очень старым проектом, который собирался с помощью Ant. При желании — можно почитать о нем в Интернете.

После Ant лидерство во главе сборщиков занял Maven. Более того, он удерживает его и по сей день. Сейчас все больше проектов переводят на Gradle, но мавен все еще очень популярный и пользуется спросом. Если Вы читали мои статьи Java web и Spring, то заметили, что все проекты я собираю с помощью maven. Для меня он удобен и простой в использовании.

Теперь попробуем разобрать немного теории.

Maven — инструмент для сборки джава проектов. Помимо подключения сторонних библиотек он используется для компиляции, создания jar, создания дистрибутива программы, генерации документации. Так сказано на официальном сайте Apache Maven.

Maven — инструмент с очень большим функционалом. В данной статье я остановлюсь только на тех моментах, которые мне кажется наиболее востребованы при изучении данного инструмента на начальных этапах.

Костяк мавен это файл pom.xml, который размещается в корне проекта. Из расширения этого файла Вы уже могли догадаться, что его формат xml. Вся его структура состоит из xml разметки.

Файл pom.xml должен иметь определенное оформление и структуру. Предлагаю изучить терминологию maven на примере типичного pom.xml небольшого проекта.

Код   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
  3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.  
  6.     <groupId>com.javamaster</groupId>
  7.     <artifactId>javamaster-tests</artifactId>
  8.     <version>0.0.1-SNAPSHOT</version>
  9.     <packaging>jar</packaging>
  10.  
  11.     <name>javamaster-tests</name>
  12.     <description>Demo project for Spring Boot</description>
  13.  
  14.     <properties>
  15.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  17.         <java.version>1.8</java.version>
  18.     </properties>
  19.  
  20.     <dependencies>
  21.         <dependency>
  22.             <groupId>org.springframework.boot</groupId>
  23.             <artifactId>spring-boot-starter-data-jpa</artifactId>
  24.         </dependency>
  25.         <dependency>
  26.             <groupId>org.springframework.boot</groupId>
  27.             <artifactId>spring-boot-starter-web</artifactId>
  28.         </dependency>
  29.  
  30.         <dependency>
  31.             <groupId>mysql</groupId>
  32.             <artifactId>mysql-connector-java</artifactId>
  33.             <scope>runtime</scope>
  34.         </dependency>
  35.         <dependency>
  36.             <groupId>org.springframework.boot</groupId>
  37.             <artifactId>spring-boot-starter-test</artifactId>
  38.             <scope>test</scope>
  39.         </dependency>
  40.         <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
  41.         <dependency>
  42.             <groupId>org.projectlombok</groupId>
  43.             <artifactId>lombok</artifactId>
  44.             <version>1.18.2</version>
  45.             <scope>provided</scope>
  46.         </dependency>
  47.         <dependency>
  48.             <groupId>org.springframework.boot</groupId>
  49.             <artifactId>spring-boot-starter-security</artifactId>
  50.         </dependency>
  51.         <dependency>
  52.             <groupId>io.jsonwebtoken</groupId>
  53.             <artifactId>jjwt</artifactId>
  54.             <version>0.6.0</version>
  55.         </dependency>
  56.         <dependency>
  57.             <groupId>org.springframework.boot</groupId>
  58.             <artifactId>spring-boot-starter-freemarker</artifactId>
  59.         </dependency>
  60.         <dependency>
  61.             <groupId>org.springframework.boot</groupId>
  62.             <artifactId>spring-boot-starter-actuator</artifactId>
  63.         </dependency>
  64.  
  65.         <dependency>
  66.             <groupId>com.sun.mail</groupId>
  67.             <artifactId>javax.mail</artifactId>
  68.             <version>1.6.0</version>
  69.         </dependency>
  70.     </dependencies>
  71.  
  72.     <build>
  73.         <plugins>
  74.             <plugin>
  75.                 <groupId>org.springframework.boot</groupId>
  76.                 <artifactId>spring-boot-maven-plugin</artifactId>
  77.                 <configuration>
  78.                     <executable>true</executable>
  79.                 </configuration>
  80.             </plugin>
  81.         </plugins>
  82.     </build>
  83.  
  84.  
  85. </project>

 

Начнем с самого начала. В самом верху документа указывается что это xml документ, его версия и кодировка: <?xml version=»1.0″ encoding=»UTF-8″?>

Далее идет тег project. В него уже и будут помещаться все остальные теги, которые Вы будете создавать.

Код   
  1. <groupId>com.javamaster</groupId>
  2.     <artifactId>javamaster-tests</artifactId>
  3.     <version>0.0.1-SNAPSHOT</version>
  4.     <packaging>jar</packaging>
  5.  
  6.     <name>javamaster-tests</name>
  7.     <description>Demo project for Spring Boot</description>

Информация по Вашему проекту: groupId (имена и структура пакетов), artifactId (название проекта),version (версия вашего приложения),packaging (как будет собран проект) — jar — как обычный джава архив, war — веб архив, для web приложений, name и description — соответственно имя и описание Вашего проекта. Они являются не столь важными и их можно опускать.

Код   
  1. <properties>
  2.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  4.         <java.version>1.8</java.version>
  5.     </properties>

В тег properties можно добавлять так называемые свойства. Я еще называю их константы. Здесь можно определить свойство и использовать его далее в документе. Пользоваться свойством нужно по его имени с таким синтаксисом: ${имя_свойства}

xml пример

Далее идет тег dependencies — в него помещаются все зависимости проекта: библиотеки, фреймворки, модули, другие проекты. Для добавления зависимости нужно воспользоваться синтаксисом:

Код   
  1. <dependency> означает, что это зависимости
  2.             <groupId>org.projectlombok</groupId> груп айди необходимой зависимости. При поиске библиотеки в Интернете Вы ее найдете
  3.             <artifactId>lombok</artifactId> артифакт айди. Такая же участь как и груп айди.
  4.             <version>1.18.2</version> версия библиотеки
  5.             <scope>provided</scope> зона видимости
  6.         </dependency>

На примере выше видно, что первые 3 пункта: groupId, artifactId и version вы сможете получить при нахождении библиотеки. Этот параметр вроде бы от Вас не зависит.

scope — это область видимости нашей библиотеки в проекте. Этот параметр позволяет указать мавену когда и для чего использовать эту зависимость. Всего есть 6 областей видимости:

  • compile — это область видимости по умолчанию. Зависимости с такой зоной видимости будут использоваться и при выполнении и при тестировании и даже при использовании этой зависимости из других проектов.
  • provided — почти как compile. Единственное ее отличие в том, что зависимость с зоной видимости provided не будет добавлена в пакет.
  • runtime — зависимость будет подключаться только во время выполнения кода.
  • test — такой зоной видимости помечаются зависимости для тестов. Например Mockito, JUnit.
  • system — зависимость, которая будет в среде java всегда. Я никогда ее не использовал.
  • import — для импорта зависимостей из других артефактов.

Если такое количество информации изрядно Вас испугало я могу сказать, что большинство библиотек, которые Вы будете подключать идут со всем необходимым набором параметров и scop-ами. Поэтому не нужно переживать и тем более учить все это.

Вроде как минимальный набор параметров файла pom.xml я описал. Теперь продолжим далее.

Код   
  1. <build>
  2.         <plugins>
  3.             <plugin>
  4.                 <groupId>org.springframework.boot</groupId>
  5.                 <artifactId>spring-boot-maven-plugin</artifactId>
  6.                 <configuration>
  7.                     <executable>true</executable>
  8.                 </configuration>
  9.             </plugin>
  10.         </plugins>
  11.     </build>

Тег, который предназначен для подключения плагинов мавен — build. В него нужно добавить plugins, а уже в этот тег конкретный плагин. Синтаксис очень напоминает синтаксис зависимостей. Только в отличие от тега dependency в данному случае нужно использовать plugin. По поводу плагинов скажу то же самое, что говорил выше. Вы будете находить их в сети в зависимости от своих потребностей и нужд. И находить Вы их будете уже в нужном формате.

По большей части работы с pom.xml Вам нужно будет копировать зависимости и плагины из Интернета и просто вставлять их в теги dependencies или plugins соответственно.

С теорией вроде бы все. Теперь перейдем к практической части.

Как уже было сказано maven — это инструмент. И как его использовать это уже выбор разработчика. Полагаю, что 90 процентов читателей работают в intellij idea или eclipse. Эти инструменты разработки имеют встроенную поддержку мавен. И Вам нет необходимости его устанавливать на компьютер.

maven

Когда Вы будете подключать зависимости они будут выкачиваться прямо из Интернета, а встроенные инструменты позволят Вам собирать и запускать проект. Тем более, сейчас такие фреймворки на подобии Spring Boot, которые позволяют запустить веб приложение с минимальным количество настроек и без Tomcat.

Maven также можно установить на свой компьютер. Это позволит создавать и собирать приложения прямо из командной строки. Последнюю версию мавен можно скачать из официального сайта, который я указал выше. Архив можно поместить в любую папку на диске. Далее нужно создать переменную M2_HOME в Path, как Вы это делали при первой установке java. Если не знаете как или забыли, почитайте статью Что нужно чтобы начать программировать на Java. Там Вы найдете пункт про среды окружения. К сожалению, я пишу статью из-под системы линукс и поэтому не смогу показать Вам весь процесс в картинках и детальных объяснениях.

Теперь, чтобы создать maven проект нужно зайти в свою idee (программу для программирования). У Вас это может быть Netbeans, Intellij idea, Eclipse. Как создавать мавен проект в Eclipse написано в статье Простой сайт на java. Воспользуйтесь ею если у Вас Eclipse. Для пользователей Intellij idea принцип создания примерно такой: File->New Project

В окне выбираем Maven и далее нам как и в случае с Eclipse предлагается выбрать архетип. Если собираетесь писать веб приложение — старайтесь выбрать архетип для веб приложения. Если же другое — выбирайте из потребностей. Можно без архетипа. Архетип означает, что структура приложения (размещение, количество папок) будет соответствовать тому типу приложения, архетип которого вы выберете. В теме мавена это для нас не важно.

мавен в идее

Я предпочитаю создавать «чистые» приложения, без архетипов. Нажимаем кнопку Next, указываем groupId, artefactId, даем нашему проекту имя и расположение и жмем Finish. После Вы увидите, что создалась структура приложения и в корне лежит файл pom.xml — тот самый, который означает, что приложение использует сборщик проектов maven.

Для того, чтобы скомпилировать код, который вы напишете в своем проекте можно использовать команду maven: mvn clean install. Если Вы пользуетесь инструментом от идеи, можно просто выбрать вкладку мавен в разделе инструментов, далее перейти в lifesycle — > clean. После этого выбрать в той же вкладке install.

clean install maven

Я предпочитаю использовать команды напрямую. Для этого я открываю терминал в корне проекта и пишу: mvn clean install

clean install from terminal

Если ошибок в коде нет и код успешно компилируется Вы должны увидеть что-то вроде такого:

успешный билд

 

Команда clean install компилирует проект и собирает его в архив. Для того, чтобы просто скомпилировать проект можно использовать команду mvn clean. Потом для сборки — mvn install.

Я предпочитаю компилировать и собирать проект одной командой mvn clean install.

Теперь Вы знаете для чего используются сборщики проектов, и роль maven в java. Как я уже говорил выше — это не вся информация о данном инструменте, но для понимания и базового пользования этого должно с лихвой хватить.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *