Сегодня попытаемся понять какую роль играет сборщик приложений 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 небольшого проекта.
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
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>
<groupId>com.javamaster</groupId>
<artifactId>javamaster-tests</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>javamaster-tests</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
</project>
Начнем с самого начала. В самом верху документа указывается что это xml документ, его версия и кодировка: <?xml version=”1.0″ encoding=”UTF-8″?>
Далее идет тег project. В него уже и будут помещаться все остальные теги, которые Вы будете создавать.
<artifactId>javamaster-tests</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>javamaster-tests</name>
<description>Demo project for Spring Boot</description>
Информация по Вашему проекту: groupId (имена и структура пакетов), artifactId (название проекта),version (версия вашего приложения),packaging (как будет собран проект) – jar – как обычный джава архив, war – веб архив, для web приложений, name и description – соответственно имя и описание Вашего проекта. Они являются не столь важными и их можно опускать.
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
В тег properties можно добавлять так называемые свойства. Я еще называю их константы. Здесь можно определить свойство и использовать его далее в документе. Пользоваться свойством нужно по его имени с таким синтаксисом: ${имя_свойства}
Далее идет тег dependencies – в него помещаются все зависимости проекта: библиотеки, фреймворки, модули, другие проекты. Для добавления зависимости нужно воспользоваться синтаксисом:
<groupId>org.projectlombok</groupId> груп айди необходимой зависимости. При поиске библиотеки в Интернете Вы ее найдете
<artifactId>lombok</artifactId> артифакт айди. Такая же участь как и груп айди.
<version>1.18.2</version> версия библиотеки
<scope>provided</scope> зона видимости
</dependency>
На примере выше видно, что первые 3 пункта: groupId, artifactId и version вы сможете получить при нахождении библиотеки. Этот параметр вроде бы от Вас не зависит.
scope – это область видимости нашей библиотеки в проекте. Этот параметр позволяет указать мавену когда и для чего использовать эту зависимость. Всего есть 6 областей видимости:
- compile – это область видимости по умолчанию. Зависимости с такой зоной видимости будут использоваться и при выполнении и при тестировании и даже при использовании этой зависимости из других проектов.
- provided – почти как compile. Единственное ее отличие в том, что зависимость с зоной видимости provided не будет добавлена в пакет.
- runtime – зависимость будет подключаться только во время выполнения кода.
- test – такой зоной видимости помечаются зависимости для тестов. Например Mockito, JUnit.
- system – зависимость, которая будет в среде java всегда. Я никогда ее не использовал.
- import – для импорта зависимостей из других артефактов.
Если такое количество информации изрядно Вас испугало я могу сказать, что большинство библиотек, которые Вы будете подключать идут со всем необходимым набором параметров и scop-ами. Поэтому не нужно переживать и тем более учить все это.
Вроде как минимальный набор параметров файла pom.xml я описал. Теперь продолжим далее.
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
Тег, который предназначен для подключения плагинов мавен – build. В него нужно добавить plugins, а уже в этот тег конкретный плагин. Синтаксис очень напоминает синтаксис зависимостей. Только в отличие от тега dependency в данному случае нужно использовать plugin. По поводу плагинов скажу то же самое, что говорил выше. Вы будете находить их в сети в зависимости от своих потребностей и нужд. И находить Вы их будете уже в нужном формате.
По большей части работы с pom.xml Вам нужно будет копировать зависимости и плагины из Интернета и просто вставлять их в теги dependencies или plugins соответственно.
С теорией вроде бы все. Теперь перейдем к практической части.
Как уже было сказано maven – это инструмент. И как его использовать это уже выбор разработчика. Полагаю, что 90 процентов читателей работают в intellij idea или eclipse. Эти инструменты разработки имеют встроенную поддержку мавен. И Вам нет необходимости его устанавливать на компьютер.
Когда Вы будете подключать зависимости они будут выкачиваться прямо из Интернета, а встроенные инструменты позволят Вам собирать и запускать проект. Тем более, сейчас такие фреймворки на подобии 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.
Я предпочитаю использовать команды напрямую. Для этого я открываю терминал в корне проекта и пишу: mvn clean install
Если ошибок в коде нет и код успешно компилируется Вы должны увидеть что-то вроде такого:
Команда clean install компилирует проект и собирает его в архив. Для того, чтобы просто скомпилировать проект можно использовать команду mvn clean. Потом для сборки – mvn install.
Я предпочитаю компилировать и собирать проект одной командой mvn clean install.
Теперь Вы знаете для чего используются сборщики проектов, и роль maven в java. Как я уже говорил выше – это не вся информация о данном инструменте, но для понимания и базового пользования этого должно с лихвой хватить.
Отличная статья! Большое спасибо. В принципе, на практике уже начинаешь немного понимать, что где как и для чего, но данная статья очень поспособствовала структурированию того, что освоено интуитивно и методом тыка. 💡
Спасибо!