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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: