Java. Spring Framework HelloWorld Example с XML и Maven

Всем привет! В предыдущей статье мы рассмотрели простенькое Spring-приложение сконфигурированное в XML без использования каких-либо сборщиков типа Gradle или Maven. Сегодня мы пойдем дальше и попробуем упростить Вам задачу, используя сборщик Maven.

Если говорить своими словами, Maven — это система сборки и управления зависимостями для Java-проектов.

Одно из Важных преимуществ Maven — это как раз управление dependency (зависимостями). Помните, как в предыдущих статьях мы добавляли необходимые библиотеки фреймворка Spring в ручную? Maven позволяет в специальном конфигурационном xml-файле просто указать в специальном формате блоки так называемых dependency и IDE сама подтянет в проект все необходимые библиотеки.

Кроме того, Maven позволяет управлять репозиториями. Что это значит? Например, вы создаете какой-то функционал, хорошая иллюстрация — так называемый коннектор, то есть набор методов, которые, предположим, ходят в некое покупное API и позволяют массово отправлять SMS или email, делать рассылки. Внутри коннектора у вас куча кода: проверки разные, антифрод, куча бойлерплейта (то есть куча обслуживающего служебного кода). А наружу у вас торчит только один метод:

Вы создаете в своей организации (или на локальной машине, если вы единственный разработчик) Maven-репозиторий, где будут лежать подобные коннекторы. После его написания вы выполняете команду mvn install для «отправки» его в репозиторий, а потом в коде ваших приложений вы указываете, где лежит ваш дополнительный репозиторий (например, если он внешний, лежит не в стандартной папке, а на отдельном сервере), указываете dependency в pom-файле и вуаля — в нужном классе, вы просто делаете import и используете метод коннектора и в хвост и в гриву.

pom-файл, он же «помник» — собственно и есть тот самый конфигурационный файл Maven’а.

У Maven есть и масса других возможностей, но о них мы поговорим позже, в других статьях. Давайте, перейдем, наконец, к написанию кода нашего приложения!


Я исхожу из того, что у Вас уже установлена JetBrains Intelij Idea. Если это не так, если вы пишете код в другой IDE или планируете использовать простой текстовой редактор типа Sublime или Vim и ставить Maven вручную, то гуглите — статей о том, как установить Maven в интернете очень много, как в англоязычном, так и в русскоязычном. Если же Вы хотите, чтобы об этом написал я, то пишите — если пост или видео наберет должное количество комментариев — то материал будет.

Итак, запускаем Вашу Intelij Idea (я использую самую последнюю версию), далее идем в File — Settings… или жмем Ctrl + Alt + S. В меню поиска вверху вбиваем «Maven» и видим примерно следующее:

У меня, как видно установлен Maven версии 3.6.1 (JetBrains сама устанавливает свой Maven, при отсутствии внешнего). И ниже в поле Local repository как раз можно увидеть ссылку, куда установлен у вас Maven. Ее нужно прописать в переменные среды Windows (если у Вас Linux — опять же, гуглите, там все чуть-чуть по другому).

Запускаем Explorer и спускаемся по этому пути. Нам нужно удостовериться в местоположении папки bin:

Как видно, у меня она есть. У Вас путь должен быть плюс-минус такой же.

Далее — правой кнопкой мыши на «Мой компьютер» или «Этот компьютер«, выбираем свойства:

… там выбираем пункт «Дополнительные параметры системы«, в появившемся диалоговом окне жмем кнопку в самом низу — «Переменные среды«. Теперь нам надо добавить пути до Maven. Жмем «Создать» под верхним списком. Добавляем переменную M2. В нее добавляем путь до папки bin:

Так же добавляем переменную M2_HOME. В нее добавляем путь до папки родительской для папки bin. Ну и в переменную Path должно быть добавлено следующее:

… то есть %M2%.

Теперь запускаем консоль и вводим:

mvn -version

… мы должны увидеть что-то подобное:

Кстати, я пользуюсь сторонней консолью ConEmu, вместо стандартной Виндусовой — рекомендую всячески! Как видно на картинке выше mvn -version подтвердил, что у меня установлена версия 3.6.1. Если система будет ругаться на то, что не опознает mvn как команду или что-то там не найдено — значит Вы как-то не так прописали пути.

Теперь попробуем создать наше приложение с консоли. Консольная команда mvn позволяет генерировать пустые джава-проекты, снабженные всеми необходимыми dependency в зависимости от «ключей», которые вы указываете при генерации. Собственно за конфигурацию приложения (то есть за набор dependency в «помнике» (см.выше — что это)) и отвечает так называемый арчетайп (archetype). Там же в cmd или любом Вашем консольном приложении (в Linux это хозяйство называется «терминал») переходим в папку, где будет расположено ваше приложение с помощью cd и вводим следующее:

Давайте сразу разберем, что это и с чем это едят. Потому что, я прекрасно помню себя, когда я только начинал изучать Яву и хватался за все подряд — все эти арчетайпы, группы, айди — все это была какая-то каша просто.

mvn archetype:generate — это собственно сама команда mvn с ключом, говорящим «сгенери мне готовый проект».

-Dgroup=com.antonromanov и -DartifactId=JavaHelloWorld — это так называемая группа и артефакт. Зачем это нужно и для чего (простыми словами)? Открою Вам сейчас боевой проект нашей компании и покажу как это используется:

Справа как раз открыт тот самый «помник» и видна его классическая структура. Неотъемлимой частью Pom-файла как раз является указание groupId и artifactId. Обратите внимание, группа частично совпадает с paсkage-name на панели слева: «club.apibank.connectors.kontur». Если перейти по url самого внешнего репозитория (как правило в больших компаниях они лежат на отдельном сервере), мы увидим:

Это web-представление удаленного репозитория. На жестком диске его структура попапочно будет плюс минус такая. Обратите внимание, сверху указана коллекция из Dgroup: club/apibank/connectors и далее представлены артифакты (artifactId), по которым можно «вытянуть» соответствующий коннектор.

Теперь собственно, вишенка на торте или зачем все это нужно. Спустя некоторое время вы создаете какой-то другой проект и хотите переиспользовать код ранее написанного из вашего репозитория. Внутри pom-файла вы в группе <dependencies> вы указываете:

<dependency>
            <groupId>club.apibank.connectors</groupId>
            <artifactId>apibank-connectors-kontur</artifactId>
</dependency>

… потом в нужном классе просто вставляете import…. и используете public-методы из своего репозитория. Собственно, при генерации проекта в консоли с помощью -DartifactId=JavaHelloWorld вы как раз и указываете по каким группам и артефактам его потом можно будет найти в репозитории.

-DarchetypeArtifactId=maven-archetype-quickstart — собственно это базовый архитип, на основе которого и создается ваш проект. Я раньше парился, типа там столько этих базвых архитипов, как же мне их все упомнить. Теперь, разобравшись уже с вопросом могу сказать — не надо их запоминать! Достаточно запомнить только этот, который создает пустой HelloWorld Maven-проект и все. Все равно в каждом случае наполнение проекта разными депенденси сугубо индивидуально.

Итак, с «Мавеном» («Мейвеном«) разобрались, идем дальше:

Кстати, можно так же в список параметров командной строки еще добавить —DinteractiveMode = false. Если вы запустите первый вариант, то он по ходу выполнения будет вам задавать уточняющие вопросы — «точно ли такая группа?». Ключ DinteractiveMode = false позволяет избавить Вас от этих вопросов и сделать все это в автоматическом режиме.

По итогу в консоли Вы увидите что-то подобное:

То есть, Ваш проект создан и можно открывать его в Вашей любимой IDE (это, конечно же, JetBrains). Открываем JetBrains, выбираем File / Open… и в дереве директорий находим папку только что созданного проекта. Но не спешите жать «Open». Раскройте свиток папки и выбирете файл pom.xml. Нажмите «Open». Появится следующее диалоговое окно:

Выбираем «Open as Project». Типичная структура вновь созданного пустого Java-Maven проекта выглядит примерно так:

Мы видим наш «помник» pom.xml, в папке test лежат как правило Unit-тесты — это нам еще долго не понадобится. Далее вы видите папки исходников: src -> maim -> java -> com.antonromanov — именно ее мы указывали в Dgroups и она же указана в открытом справа помнике в теге <groupId> </groupId>.

Давайте сразу изучим основные команды работы с Maven, которых Вам хватит на ближайшее будущее:

  • mvn clean — в процессе «упаковки» либо «инсталляции» артефактов (то есть файлов jar или war) Maven создает папку target, куда он кладет сами артефакты. clean очищает полностью эту папку и все артефакты внутри нее. Есть плагины, позволяющие на стадии clean очищать какие-либо другие папки в Вашем проекте.
  • mvn package — собственно выполнение компиляции, сборки проекта и упаковки его в war или jar. Если есть тесты или какие-то стайл-чекеры — выполняются и они.
  • mvn install — не только создается артефакт, но он так же добавляется в локальный репозиторий на Вашей машине.

Если Вы откроете вкладку справа в IntelijIdea, во вкладке Lifecycle вы увидите среди других как раз эти команды:

Их действие аналогично вводу в терминале в папке проекта вышеописанных команд.

Если в процессе запуска mvn clean вы увидите сообщение:

Source option X is no longer supported. Use 6 or later.

То нужно сделать следующее. В конец вашего pom-файла вставьте секцию build:

… после этого еще раз выполните mvn package. Вы должны увидеть нечто походее на:

Обратите внимание на то, что я выделил желтым:

  • Создалась папка target c артефактами;
  • В консоли мы видим строчку «Building… «, где Мавен показал нам где и какой он создал артефакт.
  • Ну и мы так же видим так важный для нас «BUILD SUCCESS».

Собственно, теперь нам надо добавить эти самые пресловутые dependency в наш проект. Ниже я укажу полный код pom.xml, чтобы Вы видели что за чем идет и в будущем у Вас не было путаницы:

Теперь, нам осталось лишь наполнить наши классы кодом (это мы делали в предыдущей статье, поэтому нового особо ничего тут не будет) и проверить, что все работает.

Создаем класс HelloWorld как и в прошлый раз (в пакете com.antonromanov). Его код такой же, как и в прошлый раз:

Главный класс, отвечающий за запуск и конфигурацию Spring-контейнера тоже не поменялся:

Но обратите внимание, где теперь лежит Beans.xml. Именно это немного меняется с приходом в проект Maven. Собственно, на картинке можно увидеть всю структуру проекта:

Да, верно, у нас появилась папка resources и Beans.xml лежит в ней. Его код тот же:

Ну а теперь, запускаем приложение и наслаждаемся! Поздравляю: Вы только что создали свое первое Spring-приложение с XML-конфигурацией со сборщиком Maven!!!!

Оставьте комментарий

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