1.1 Большие программы

Мы уже научились писать маленькие программы, поэтому теперь будем учиться писать большие. Как известно, чем больше и сложнее программа, тем больше за ее разработку платят денег:) И начнем с небольшой предыстории…

С ростом размера программ разработчики столкнулись с двумя новыми для себя обстоятельствами:

  • Над одной программой работает большое количество людей.
  • Нет такого человека, который бы знал весь код программы.

Очень часто начали возникать ситуации, когда программист фиксил баг в одном месте программы и при этом ломал что-то в другом. В release documentation даже появилась такая шутка:

Список изменений:

  • Исправили старые баги :)
  • Добавили новые :(

Тогда же придумали два подхода к решению этой проблемы: технический и менеджерский.

Технический подход заключался в том, что программы разбивали на части: библиотеки и модули. Каждый такой модуль был небольшим кирпичиком из которых потом выстраивались большие проекты. Библиотеки же – это такие универсальные компоненты, которые могут использоваться в разных программах.

Менеджерский подход был еще интереснее – они ограничивал количество людей, которые могут работать над одним проектом/библиотекой. Эмпирически даже вывели правило: команда должна быть настолько большой, чтобы "ее можно было накормить двумя пиццами". Обычно это означает, что если над проектом работает более 8 человек, то его нужно разделить на два проекта.

В сообществе Java-разработчиков популярным стало написание библиотек на все случаи жизни и выкладывание их в общий доступ. Таким образом, Java-программисты могли не писать снова один и тот же код (который зачастую был сыроват и содержал баги), а пользоваться готовыми и проверенными решениями.

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

Во-вторых, у серверов практически нет ограничений на размер кода. Разработчик мобильного приложения старается впихнуть его в 10 мегабайт, десктопного приложения – в 100 мегабайт. А бэкенд-разработчик на Java может напихать в проект несколько десятков гигабайт библиотек и ему слова никто не скажет :)

Это, кстати, не шутка. Легко можно встретить бэкенд-проект из нескольких десятков модулей и с парой сотен библиотек. Вот только описывать (и изменять!) сценарии сборки таких проектов стало чрезвычайно трудно.

И тут появился Maven.

1.2 Знакомство с Maven

Maven – это специальный “фреймворк” для управления сборкой проектов. Он стандартизирует 3 вещи:
  • Описание проекта;
  • Сценарии сборки проектов;
  • Зависимости между библиотеками.

Предшественником Maven’а был Ant, а наследником является Gradle. Но именно Maven развил и довел до совершенства три перечисленных стандарта, а также регламентировал их взаимодействие. Именно он вывел работу Java-сообществ на новый уровень. Давай же посмотрим на него подробнее.

Maven’а

Технически Maven – это специальная программа/сервис, основная цель которой управлять процессом сборки проектов. Ее можно просто скачать в виде архива и распаковать в любую директорию. Специальный установщик для этого не нужен.

Графического интерфейса у нее нет – все команды отдаются ей с помощью консоли. Чтобы еще более комфортно с ней работать, рекомендуется прописать в своей ОС специальные переменные окружения (environment variables).

Так же у Maven есть специальный репозиторий (директория/папка), где он хранит библиотеки, которые используются им при сборке проектов. Тебе нужно будет выбрать какую-нибудь папку на диске и назначить ее в качестве репозитория.

Еще из интересного можно отметить наличие глобального Maven-репозитория для всех библиотек, но об этом расскажем немного позже.

1.3 Загрузка и установка Maven

У Maven есть официальный сайт maven.apache.org. Там очень много документации по проекту, так что, если возникнут сложности или дополнительные вопросы – заходи, не стесняйся.

Также на странице downloads (https://maven.apache.org/download.cgi) можно скачать архив с maven (apache-maven-3.8.5-bin.zip). Распакованный архив займет где-то 10 Мб, хотя для локального maven репозитория со временем потребуется несколько сотен мегабайт памяти.

Maven написан на Java и требует JRE не ниже 7 версии, а также прописанные переменные окружения типа JAVA_HOME.

Просто создай на компьютере папку для Maven, например, d:\devtools, и распакуй в нее архив с Maven. В итоге у тебя должна получиться папка типа d:\devtools\maven\bin, где будут находиться основные бинарные файлы проекта.

1.4 Переменные окружения

После этого нужно добавить путь к папке bin из распакованного архива в переменную среды PATH.

Чтобы установить переменную среды (environment variable) в Windows 10, нужно перейти в Панель управления — Система — Дополнительные параметры системы. Затем нажать “Переменные среды”, найти PATH и выбрать “Изменить”, после чего добавить путь d:\devtools\maven\bin в конец строки. Обрати внимание, путь должен вести именно к папке bin.

В ОС на основе Unix переменную среды можно добавить консольной командной:


export PATH=/opt/apache-maven-3.8.5/bin:$PATH

Если ты все сделал правильно, то в консоли нужно набрать команду: «mvn -v». В ответ ты увидишь что-то типа:


C:\Users\Zapp>mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 15:51:28+0200)
Maven home: T:\apache-maven-3.0.5\bin\..
Java version: 1.8.0_65, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_65\jre
Default locale: en_US, platform encoding: Cp1251
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"

1.5 Локальный репозиторий Maven

Также ты можешь задать специальную папку, где Maven будет хранить jar-библиотеки, которые будет использовать при сборке проектов. Такую папку называют – локальный maven репозиторий.

Если такая папка не задана, то Maven создаст ее в домашней директории текущего пользователя. У меня это директория: C:\Users\Zapp\.m2

Папка имеет довольно специфическое имя “.m2”. Хотя пользователей Linux оно не пугает – там это довольно распространенный подход к именованию различных ”репозиториев” и/или любого другого хранилища служебной информации.

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

Maven до версии 3.5 требовал указать переменную окружения с именем M2_HOME, но теперь это не нужно.

Более подробно о конфигурировании Maven можно почитать по ссылке: https://maven.apache.org/configure.html