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 небольшого проекта.

Код   
<?xml version="1.0" encoding="UTF-8"?>
<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. В него уже и будут помещаться все остальные теги, которые Вы будете создавать.

Код   
<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>

Информация по Вашему проекту: groupId (имена и структура пакетов), artifactId (название проекта),version (версия вашего приложения),packaging (как будет собран проект) – jar – как обычный джава архив, war – веб архив, для web приложений, name и 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>

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

xml пример

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

Код   
<dependency> означает, что это зависимости
            <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 я описал. Теперь продолжим далее.

Код   
<build>
        <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. Эти инструменты разработки имеют встроенную поддержку мавен. И Вам нет необходимости его устанавливать на компьютер.

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. Как я уже говорил выше – это не вся информация о данном инструменте, но для понимания и базового пользования этого должно с лихвой хватить.

2 thoughts on “Maven и java”

  1. Отличная статья! Большое спасибо. В принципе, на практике уже начинаешь немного понимать, что где как и для чего, но данная статья очень поспособствовала структурированию того, что освоено интуитивно и методом тыка. 💡

Leave a Comment

Your email address will not be published.