Автоматизация сборки Java проектов 
Часть 1. Про инструменты сборки вообще 
Часть 2. Про Maven
Часть 1. Про инструменты сборки вообще 
Библиотека HelloWorld
Типичные проблемы 
● Структура кода. Где и что хранится?
Типичные проблемы 
● Структура кода. Где и что хранится? 
● Как скомпилировать код (поддержка javac)?
Типичные проблемы 
● Структура кода. Где и что хранится? 
● Как скомпилировать код (поддержка javac)? 
● Как выполнить тесты?
Типичные проблемы 
● Структура кода. Где и что хранится? 
● Как скомпилировать код (поддержка javac)? 
● Как выполнить тесты? 
● Как разбить процесс сборки на стадии?
Типичные проблемы 
● Структура кода. Где и что хранится? 
● Как скомпилировать код (поддержка javac)? 
● Как выполнить тесты? 
● Как разбить процесс сборки на стадии? 
● Где хранить сторонние библиотеки?
Типичные проблемы 
● Структура кода. Где и что хранится? 
● Как скомпилировать код (поддержка javac)? 
● Как выполнить тесты? 
● Как разбить процесс сборки на стадии? 
● Где хранить сторонние библиотеки? 
● Как версионировать продукт?
Типичные проблемы 
● Структура кода. Где и что хранится? 
● Как скомпилировать код (поддержка javac)? 
● Как выполнить тесты? 
● Как разбить процесс сборки на стадии? 
● Где хранить сторонние библиотеки? 
● Как версионировать продукт? 
● Как передавать свои разработки другим людям?
Инструменты сборки 
● Компиляция кода
Инструменты сборки 
● Компиляция кода 
● Запуск тестов и определение степени покрытия 
кода
Инструменты сборки 
● Компиляция кода 
● Запуск тестов и определение степени покрытия 
кода 
● Статический анализ кода: поиск ошибок в коде 
без его выполнения
Инструменты сборки 
● Компиляция кода 
● Запуск тестов и определение степени покрытия 
кода 
● Статический анализ кода: поиск ошибок в коде 
без его выполнения 
● Сборка архивов с бинарными файлами, 
исходными кодами, документацией
Инструменты сборки 
● Компиляция кода 
● Запуск тестов и определение степени покрытия 
кода 
● Статический анализ кода: поиск ошибок в коде 
без его выполнения 
● Сборка архивов с бинарными файлами, 
исходными кодами, документацией 
● Построение отчетов
Польза от инструментов сборки 
● Уменьшение числа рутинных ошибок
Польза от инструментов сборки 
● Уменьшение числа рутинных ошибок 
● Уменьшение времени сборки проекта
Польза от инструментов сборки 
● Уменьшение числа рутинных ошибок 
● Уменьшение времени сборки проекта 
● Можно хранить историю сборок проекта и 
анализировать ошибки
Польза от инструментов сборки 
● Уменьшение числа рутинных ошибок 
● Уменьшение времени сборки проекта 
● Можно хранить историю сборок проекта и 
анализировать ошибки 
● В итоге – уменьшение затрат и улучшение 
качества продукта
История развития инструментов 
сборки 
https://github.com/autoschool/build-tools
Нет автоматизации 
Недостатки 
● Неудобно работать с большим число файлов 
● Не поддерживается условная логика 
● Платформозависимость 
● ...
Shell-скрипт
Shell-скрипт. Преимущества 
● Можно выполнять много команд без 
копирования 
● Условная логика 
● Примитивное разбиение на стадии: 
clean.sh, compile.sh, test.sh
Shell-скрипт. Недостатки 
● Платформозависим 
● Нет единого подхода к описанию 
процесса сборки
Make (1977 год) 
Makefile
Make. Преимущества 
● Единый формат описания процесса сборки
Make. Недостатки 
● Платформозависим 
● Tab символы в Makefile 
● Нет поддержки Java задач, параметров, 
плагинов
Apache Ant (2000 год) 
build.xml
Apache Ant. Преимущества 
● Поддержка Java-специфичных задач 
● Переносимость между платформами 
● Возможность расширения (плагины) 
● Параметризованные билды
Apache Ant. Недостатки 
● Нет конвенций версионирования кода
Apache Ant. Недостатки 
● Нет конвенций версионирования кода 
● Нет конвенций по расположению кода
Apache Ant. Недостатки 
● Нет конвенций версионирования кода 
● Нет конвенций по расположению кода 
● Нет автоматического управления 
зависимостями (их кладут в lib/)
Apache Ant. Недостатки 
● Нет конвенций версионирования кода 
● Нет конвенций по расположению кода 
● Нет автоматического управления 
зависимостями (их кладут в lib/) 
● Произвольный набор целей (нет жизненного 
цикла)
Apache Ant. Недостатки 
● Нет конвенций версионирования кода 
● Нет конвенций по расположению кода 
● Нет автоматического управления 
зависимостями (их кладут в lib/) 
● Произвольный набор целей (нет жизненного 
цикла) 
● Императивный стиль описания билда 
(последовательность действий)
Apache Ant. Недостатки 
● Нет конвенций версионирования кода 
● Нет конвенций по расположению кода 
● Нет автоматического управления 
зависимостями (их кладут в lib/) 
● Произвольный набор целей (нет жизненного 
цикла) 
● Императивный стиль описания билда 
(последовательность действий) 
● Не поддерживает JUnit 4
Apache Ivy (2004) 
ivy.xml 
Решили проблему Ant: 
● Автоматическое управление зависимостями
Apache Maven (2004 год) 
pom.xml
Apache Maven 
● Конвенции расположения кода, тестов, 
ресурсов и т.д.
Apache Maven 
● Конвенции расположения кода, тестов, 
ресурсов и т.д. 
● Четкий жизненный цикл: цели предопределены
Apache Maven 
● Конвенции расположения кода, тестов, 
ресурсов и т.д. 
● Четкий жизненный цикл: цели предопределены 
● Способ поделиться кодом с другими – 
удаленные репозитории зависимостей
Apache Maven 
● Конвенции расположения кода, тестов, 
ресурсов и т.д. 
● Четкий жизненный цикл: цели предопределены 
● Способ поделиться кодом с другими – 
удаленные репозитории зависимостей 
● Понятный механизм хранения зависимостей – 
локальный репозиторий
Apache Maven 
● Правила версионирования кода
Apache Maven 
● Правила версионирования кода 
● Поддержка многомодульных проектов
Apache Maven 
● Правила версионирования кода 
● Поддержка многомодульных проектов 
● Декларативный подход к описанию билда
Apache Maven 
● Правила версионирования кода 
● Поддержка многомодульных проектов 
● Декларативный подход к описанию билда 
● Модульная структура (даже простые действия 
делают плагины)
Gradle (2009 год) 
build.gradle
Gradle 
● Поддерживает основные возможности Maven
Gradle 
● Поддерживает основные возможности Maven 
● Файл build.gradle с DSL на Groovy
Gradle 
● Поддерживает основные возможности Maven 
● Файл build.gradle с DSL на Groovy 
● Инкрементальная компиляция
Gradle 
● Поддерживает основные возможности Maven 
● Файл build.gradle с DSL на Groovy 
● Инкрементальная компиляция 
● Использует те же удаленные репозитории, что 
и Maven
Gradle 
● Поддерживает основные возможности Maven 
● Файл build.gradle с DSL на Groovy 
● Инкрементальная компиляция 
● Использует те же удаленные репозитории, что 
и Maven 
● Эмулирует поведение Maven, но можно 
задавать свой порядок целей
Gradle 
● Поддерживает основные возможности Maven 
● Файл build.gradle с DSL на Groovy 
● Инкрементальная компиляция 
● Использует те же удаленные репозитории, что 
и Maven 
● Эмулирует поведение Maven, но можно 
задавать свой порядок целей 
● Поддерживает плагины, несовместимые с 
Maven
SBT (2011) 
build.sbt, build.scala
SBT 
Интерактивная консоль
SBT 
● Полная поддержка компиляции Scala
SBT 
● Полная поддержка компиляции Scala 
● Интерактивная консоль
SBT 
● Полная поддержка компиляции Scala 
● Интерактивная консоль 
● Инкрементальная компиляция кода
SBT 
● Полная поддержка компиляции Scala 
● Интерактивная консоль 
● Инкрементальная компиляция кода 
● Файлы build.sbt и build.scala (требуется 
компиляция)
SBT 
● Полная поддержка компиляции Scala 
● Интерактивная консоль 
● Инкрементальная компиляция кода 
● Файлы build.sbt и build.scala (требуется 
компиляция) 
● Плагины, несовместимые с Maven
Leiningen 
project.clj
Leiningen (Clojure) 
● Файл project.clj на Clojure 
● Зависимости из репозиториев Maven 
● Альтернативный репозиторий Clojars 
(http://clojars.org)
Инструменты сборки в 
других языках программирования
Rake (Ruby) 
Rakefile 
Система управления зависимостями – RubyGems
Grunt (Javascript) 
Gruntfile.js 
Система управления зависимостями – Bower
Cabal (Haskell) 
*.cabal
Cabal 
● Собственный репозиторий артефактов Hackage 
● Архивы с расширением *.tar.gz, а не *.jar.
Современная система сборки на 
любом языке 
● Основная цель – автоматизация действий с 
кодом на локальной машине разработчика
Современная система сборки на 
любом языке 
● Основная цель – автоматизация действий с 
кодом на локальной машине разработчика 
● Автоматическое управление зависимостями
Современная система сборки на 
любом языке 
● Основная цель – автоматизация действий с 
кодом на локальной машине разработчика 
● Автоматическое управление зависимостями 
● Хранилища артефактов
Современная система сборки на 
любом языке 
● Основная цель – автоматизация действий с 
кодом на локальной машине разработчика 
● Автоматическое управление зависимостями 
● Хранилища артефактов 
● Четкий жизненный цикл
Современная система сборки на 
любом языке 
● Основная цель – автоматизация действий с 
кодом на локальной машине разработчика 
● Автоматическое управление зависимостями 
● Хранилища артефактов 
● Четкий жизненный цикл 
● Конвенции версионирования
Современная система сборки на 
любом языке 
● Основная цель – автоматизация действий с 
кодом на локальной машине разработчика 
● Автоматическое управление зависимостями 
● Хранилища артефактов 
● Четкий жизненный цикл 
● Конвенции версионирования 
● Конвенции расположения исходного кода
Часть 2. Про Maven 
Файл pom.xml 
● Все pom.xml переопределяют “super pom”
Часть 2. Про Maven 
Файл pom.xml 
● Все pom.xml переопределяют “super pom” 
● Описание проекта (название, версия, ссылки 
на исходные коды, CI, лицензия, разработчики 
и т.п.)
Часть 2. Про Maven 
Файл pom.xml 
● Все pom.xml переопределяют “super pom” 
● Описание проекта (название, версия, ссылки 
на исходные коды, CI, лицензия, разработчики 
и т.п.) 
● Список зависимостей
Часть 2. Про Maven 
Файл pom.xml 
● Все pom.xml переопределяют “super pom” 
● Описание проекта (название, версия, ссылки 
на исходные коды, CI, лицензия, разработчики 
и т.п.) 
● Список зависимостей 
● Список плагинов и их конфигурация
Часть 2. Про Maven 
● Все pom.xml переопределяют “super pom” 
● Описание проекта (название, версия, ссылки 
на исходные коды, CI, лицензия, разработчики 
и т.п.) 
● Список зависимостей 
● Список плагинов и их конфигурация 
● Профили 
Файл pom.xml
Название проекта и параметры
Список модулей
Информация о проекте
Описание сборки проекта (плагины)
Зависимости
Именование директорий 
● src/ - все исходные коды 
● src/main – все, что касается продукта 
● src/test – все, что касается тестов
Именование директорий 
● src/main/java – Java-код продукта 
● src/main/resources – ресурсы продукта 
● src/main/webapp – файлы веб-приложений 
продукта (стили, Javascript и т.п.)
Именование директорий 
● src/test/java – Java-код тестов 
● src/test/resources – ресурсы тестов 
● src/test/webapp – файлы веб-приложений 
тестов
Жизненные циклы Maven 
● Clean – очищает проект перед сборкой 
● Default – собирает проект 
● Site – создает сайт проекта со ссылками на 
зависимости, CI, тикетную систему и т.п.
Сборка проекта. Команда mvn. 
● Validate – проверить правильность проекта 
● Compile – скомпилировать исходники 
● Test – скомпилировать и выполнить тесты 
● Package – упаковать скомпилированный код и исходники 
● Verify – проверить, что код правильно упакован 
● Install – установить пакеты в локальный репозиторий 
● Deploy – выгрузить пакеты в удаленный репозиторий
Управление зависимостями 
● Секции <dependencies> и 
<dependencyManagement> 
● Зависимость = groupId + artifactId + номер 
версии + scope 
● Scope: compile, test, runtime, provided, system
Версии пакетов. Релизы и снепшоты 
● Снепшот – промежуточная версия пакета, 
используемая в разработке: 1.0-SNAPSHOT. Может 
быть бесконечно много снепшотов с одной и той же 
версией. 
● Релиз – стабильная версия пакета, предназначенная 
для использования другими проектами: 1.0. Релиз 
всегда один. 
● Порядок версий: 1.0-SNAPSHOT, 1.0, 1.1-SNAPSHOT, 
1.1, 1.2-SNAPSHOT и т.д.
Конфликт зависимостей. Дерево 
зависимостей. 
● Для разрешения конфликтов зависимостей 
нужно построить дерево зависимостей 
● Построение дерева зависимостей:
Пример дерева зависимостей
Исключение зависимостей 
● Исключение зависимостей – exclusions:
Необязательные зависимости 
● Такая зависимость не будет скачиваться в 
проектах, зависящих от данного 
● Для того, чтобы пометить необязательную 
зависимость – секция optional:
Плагины. Настройка билда. 
Изменение процесса билда – это изменение 
настроек отдельных плагинов в секции 
build/plugins.
Maven Compiler Plugin 
● Компилирует Java-код продукта и тестов 
● Основная настройка – версия компилятора 
● Настройка:
Maven Source Plugin 
● Упаковывает исходные коды проекта 
● Настройка:
Maven Dependency Plugin 
● Разрешение зависимостей, построение дерева зависимостей 
● Копирование, распаковка и другие операции с 
зависимостями
Maven Jar Plugin 
● Упаковывает файлы в jar-архив:
Maven Assembly Plugin 
● Сборка дистрибутивов продукта (например, 
zip-архив с jar, bash-скриптами и README)
Maven Release Plugin 
● Автоматизирует выкладку релизов 
● Добавляются цели release:prepare и 
release:perform 
● Настройка:
Maven Surefire Plugin 
● Выполнение тестов Junit или TestNG
Maven Site Plugin 
● Первоначальное назначение - сгенерировать 
сайт проекта 
● Основное применение – генерация отчетов 
● Настройка:
Служебные файлы и каталоги 
● Папка ~/.m2 – локальный репозиторий артефактов 
● Файлы ~/.m2/settings.xml и /etc/maven/settings.xml, 
~/.mavenrc и /etc/mavenrc – конфигурация Maven
Профили. Settings.xml 
● Профиль – способ изменять настройки билда, 
не изменяя pom.xml 
● Профиль хранится в pom.xml или в settings.xml 
в секции profiles 
● Использование профиля:
Пример профиля
Центральные репозитории 
артефактов 
● Maven Central Repository (http://maven.org/) 
● В папке репозитория: 
– maven-metadata.xml 
– jar, jar.md5, jar.sha1 
– javadoc.jar, javadoc.jar.md5, javadoc.jar.sha1 
– sources.jar, sources.jar.md5, sources.jar.sha1 
– jar.asc, jar.asc.md5, jar.asc.sha1 
● Специализированные веб-приложения Sonatype Nexus и 
Artifactory
Пример папки из центрального 
репозитория
Локальный репозиторий артефактов 
● Кэширует данные с центрального репозитория 
● В папке репозитория: 
– pom, pom.sha1 
– jar, jar.sha1 
– javadoc.jar, javadoc.jar.sha1 
– sources.jar, sources.jar.sha1 
● За счет кэширования ускоряется выполнение 
билда
Пример папки из локального 
репозитория
Архетипы 
● Архетип – готовый шаблон проекта 
● Создание проекта по шаблону:
Крутов Иван 
Skype: vania-pooh 
vania-pooh@yandex-team.ru

Иван Крутов - Автоматизация сборки Java-проекта

  • 2.
    Автоматизация сборки Javaпроектов Часть 1. Про инструменты сборки вообще Часть 2. Про Maven
  • 3.
    Часть 1. Проинструменты сборки вообще Библиотека HelloWorld
  • 4.
    Типичные проблемы ●Структура кода. Где и что хранится?
  • 5.
    Типичные проблемы ●Структура кода. Где и что хранится? ● Как скомпилировать код (поддержка javac)?
  • 6.
    Типичные проблемы ●Структура кода. Где и что хранится? ● Как скомпилировать код (поддержка javac)? ● Как выполнить тесты?
  • 7.
    Типичные проблемы ●Структура кода. Где и что хранится? ● Как скомпилировать код (поддержка javac)? ● Как выполнить тесты? ● Как разбить процесс сборки на стадии?
  • 8.
    Типичные проблемы ●Структура кода. Где и что хранится? ● Как скомпилировать код (поддержка javac)? ● Как выполнить тесты? ● Как разбить процесс сборки на стадии? ● Где хранить сторонние библиотеки?
  • 9.
    Типичные проблемы ●Структура кода. Где и что хранится? ● Как скомпилировать код (поддержка javac)? ● Как выполнить тесты? ● Как разбить процесс сборки на стадии? ● Где хранить сторонние библиотеки? ● Как версионировать продукт?
  • 10.
    Типичные проблемы ●Структура кода. Где и что хранится? ● Как скомпилировать код (поддержка javac)? ● Как выполнить тесты? ● Как разбить процесс сборки на стадии? ● Где хранить сторонние библиотеки? ● Как версионировать продукт? ● Как передавать свои разработки другим людям?
  • 11.
    Инструменты сборки ●Компиляция кода
  • 12.
    Инструменты сборки ●Компиляция кода ● Запуск тестов и определение степени покрытия кода
  • 13.
    Инструменты сборки ●Компиляция кода ● Запуск тестов и определение степени покрытия кода ● Статический анализ кода: поиск ошибок в коде без его выполнения
  • 14.
    Инструменты сборки ●Компиляция кода ● Запуск тестов и определение степени покрытия кода ● Статический анализ кода: поиск ошибок в коде без его выполнения ● Сборка архивов с бинарными файлами, исходными кодами, документацией
  • 15.
    Инструменты сборки ●Компиляция кода ● Запуск тестов и определение степени покрытия кода ● Статический анализ кода: поиск ошибок в коде без его выполнения ● Сборка архивов с бинарными файлами, исходными кодами, документацией ● Построение отчетов
  • 16.
    Польза от инструментовсборки ● Уменьшение числа рутинных ошибок
  • 17.
    Польза от инструментовсборки ● Уменьшение числа рутинных ошибок ● Уменьшение времени сборки проекта
  • 18.
    Польза от инструментовсборки ● Уменьшение числа рутинных ошибок ● Уменьшение времени сборки проекта ● Можно хранить историю сборок проекта и анализировать ошибки
  • 19.
    Польза от инструментовсборки ● Уменьшение числа рутинных ошибок ● Уменьшение времени сборки проекта ● Можно хранить историю сборок проекта и анализировать ошибки ● В итоге – уменьшение затрат и улучшение качества продукта
  • 20.
    История развития инструментов сборки https://github.com/autoschool/build-tools
  • 21.
    Нет автоматизации Недостатки ● Неудобно работать с большим число файлов ● Не поддерживается условная логика ● Платформозависимость ● ...
  • 22.
  • 23.
    Shell-скрипт. Преимущества ●Можно выполнять много команд без копирования ● Условная логика ● Примитивное разбиение на стадии: clean.sh, compile.sh, test.sh
  • 24.
    Shell-скрипт. Недостатки ●Платформозависим ● Нет единого подхода к описанию процесса сборки
  • 25.
  • 26.
    Make. Преимущества ●Единый формат описания процесса сборки
  • 27.
    Make. Недостатки ●Платформозависим ● Tab символы в Makefile ● Нет поддержки Java задач, параметров, плагинов
  • 28.
    Apache Ant (2000год) build.xml
  • 29.
    Apache Ant. Преимущества ● Поддержка Java-специфичных задач ● Переносимость между платформами ● Возможность расширения (плагины) ● Параметризованные билды
  • 30.
    Apache Ant. Недостатки ● Нет конвенций версионирования кода
  • 31.
    Apache Ant. Недостатки ● Нет конвенций версионирования кода ● Нет конвенций по расположению кода
  • 32.
    Apache Ant. Недостатки ● Нет конвенций версионирования кода ● Нет конвенций по расположению кода ● Нет автоматического управления зависимостями (их кладут в lib/)
  • 33.
    Apache Ant. Недостатки ● Нет конвенций версионирования кода ● Нет конвенций по расположению кода ● Нет автоматического управления зависимостями (их кладут в lib/) ● Произвольный набор целей (нет жизненного цикла)
  • 34.
    Apache Ant. Недостатки ● Нет конвенций версионирования кода ● Нет конвенций по расположению кода ● Нет автоматического управления зависимостями (их кладут в lib/) ● Произвольный набор целей (нет жизненного цикла) ● Императивный стиль описания билда (последовательность действий)
  • 35.
    Apache Ant. Недостатки ● Нет конвенций версионирования кода ● Нет конвенций по расположению кода ● Нет автоматического управления зависимостями (их кладут в lib/) ● Произвольный набор целей (нет жизненного цикла) ● Императивный стиль описания билда (последовательность действий) ● Не поддерживает JUnit 4
  • 36.
    Apache Ivy (2004) ivy.xml Решили проблему Ant: ● Автоматическое управление зависимостями
  • 37.
    Apache Maven (2004год) pom.xml
  • 38.
    Apache Maven ●Конвенции расположения кода, тестов, ресурсов и т.д.
  • 39.
    Apache Maven ●Конвенции расположения кода, тестов, ресурсов и т.д. ● Четкий жизненный цикл: цели предопределены
  • 40.
    Apache Maven ●Конвенции расположения кода, тестов, ресурсов и т.д. ● Четкий жизненный цикл: цели предопределены ● Способ поделиться кодом с другими – удаленные репозитории зависимостей
  • 41.
    Apache Maven ●Конвенции расположения кода, тестов, ресурсов и т.д. ● Четкий жизненный цикл: цели предопределены ● Способ поделиться кодом с другими – удаленные репозитории зависимостей ● Понятный механизм хранения зависимостей – локальный репозиторий
  • 42.
    Apache Maven ●Правила версионирования кода
  • 43.
    Apache Maven ●Правила версионирования кода ● Поддержка многомодульных проектов
  • 44.
    Apache Maven ●Правила версионирования кода ● Поддержка многомодульных проектов ● Декларативный подход к описанию билда
  • 45.
    Apache Maven ●Правила версионирования кода ● Поддержка многомодульных проектов ● Декларативный подход к описанию билда ● Модульная структура (даже простые действия делают плагины)
  • 46.
    Gradle (2009 год) build.gradle
  • 47.
    Gradle ● Поддерживаетосновные возможности Maven
  • 48.
    Gradle ● Поддерживаетосновные возможности Maven ● Файл build.gradle с DSL на Groovy
  • 49.
    Gradle ● Поддерживаетосновные возможности Maven ● Файл build.gradle с DSL на Groovy ● Инкрементальная компиляция
  • 50.
    Gradle ● Поддерживаетосновные возможности Maven ● Файл build.gradle с DSL на Groovy ● Инкрементальная компиляция ● Использует те же удаленные репозитории, что и Maven
  • 51.
    Gradle ● Поддерживаетосновные возможности Maven ● Файл build.gradle с DSL на Groovy ● Инкрементальная компиляция ● Использует те же удаленные репозитории, что и Maven ● Эмулирует поведение Maven, но можно задавать свой порядок целей
  • 52.
    Gradle ● Поддерживаетосновные возможности Maven ● Файл build.gradle с DSL на Groovy ● Инкрементальная компиляция ● Использует те же удаленные репозитории, что и Maven ● Эмулирует поведение Maven, но можно задавать свой порядок целей ● Поддерживает плагины, несовместимые с Maven
  • 53.
  • 54.
  • 55.
    SBT ● Полнаяподдержка компиляции Scala
  • 56.
    SBT ● Полнаяподдержка компиляции Scala ● Интерактивная консоль
  • 57.
    SBT ● Полнаяподдержка компиляции Scala ● Интерактивная консоль ● Инкрементальная компиляция кода
  • 58.
    SBT ● Полнаяподдержка компиляции Scala ● Интерактивная консоль ● Инкрементальная компиляция кода ● Файлы build.sbt и build.scala (требуется компиляция)
  • 59.
    SBT ● Полнаяподдержка компиляции Scala ● Интерактивная консоль ● Инкрементальная компиляция кода ● Файлы build.sbt и build.scala (требуется компиляция) ● Плагины, несовместимые с Maven
  • 60.
  • 61.
    Leiningen (Clojure) ●Файл project.clj на Clojure ● Зависимости из репозиториев Maven ● Альтернативный репозиторий Clojars (http://clojars.org)
  • 62.
    Инструменты сборки в других языках программирования
  • 63.
    Rake (Ruby) Rakefile Система управления зависимостями – RubyGems
  • 64.
    Grunt (Javascript) Gruntfile.js Система управления зависимостями – Bower
  • 65.
  • 66.
    Cabal ● Собственныйрепозиторий артефактов Hackage ● Архивы с расширением *.tar.gz, а не *.jar.
  • 67.
    Современная система сборкина любом языке ● Основная цель – автоматизация действий с кодом на локальной машине разработчика
  • 68.
    Современная система сборкина любом языке ● Основная цель – автоматизация действий с кодом на локальной машине разработчика ● Автоматическое управление зависимостями
  • 69.
    Современная система сборкина любом языке ● Основная цель – автоматизация действий с кодом на локальной машине разработчика ● Автоматическое управление зависимостями ● Хранилища артефактов
  • 70.
    Современная система сборкина любом языке ● Основная цель – автоматизация действий с кодом на локальной машине разработчика ● Автоматическое управление зависимостями ● Хранилища артефактов ● Четкий жизненный цикл
  • 71.
    Современная система сборкина любом языке ● Основная цель – автоматизация действий с кодом на локальной машине разработчика ● Автоматическое управление зависимостями ● Хранилища артефактов ● Четкий жизненный цикл ● Конвенции версионирования
  • 72.
    Современная система сборкина любом языке ● Основная цель – автоматизация действий с кодом на локальной машине разработчика ● Автоматическое управление зависимостями ● Хранилища артефактов ● Четкий жизненный цикл ● Конвенции версионирования ● Конвенции расположения исходного кода
  • 73.
    Часть 2. ПроMaven Файл pom.xml ● Все pom.xml переопределяют “super pom”
  • 74.
    Часть 2. ПроMaven Файл pom.xml ● Все pom.xml переопределяют “super pom” ● Описание проекта (название, версия, ссылки на исходные коды, CI, лицензия, разработчики и т.п.)
  • 75.
    Часть 2. ПроMaven Файл pom.xml ● Все pom.xml переопределяют “super pom” ● Описание проекта (название, версия, ссылки на исходные коды, CI, лицензия, разработчики и т.п.) ● Список зависимостей
  • 76.
    Часть 2. ПроMaven Файл pom.xml ● Все pom.xml переопределяют “super pom” ● Описание проекта (название, версия, ссылки на исходные коды, CI, лицензия, разработчики и т.п.) ● Список зависимостей ● Список плагинов и их конфигурация
  • 77.
    Часть 2. ПроMaven ● Все pom.xml переопределяют “super pom” ● Описание проекта (название, версия, ссылки на исходные коды, CI, лицензия, разработчики и т.п.) ● Список зависимостей ● Список плагинов и их конфигурация ● Профили Файл pom.xml
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
    Именование директорий ●src/ - все исходные коды ● src/main – все, что касается продукта ● src/test – все, что касается тестов
  • 84.
    Именование директорий ●src/main/java – Java-код продукта ● src/main/resources – ресурсы продукта ● src/main/webapp – файлы веб-приложений продукта (стили, Javascript и т.п.)
  • 85.
    Именование директорий ●src/test/java – Java-код тестов ● src/test/resources – ресурсы тестов ● src/test/webapp – файлы веб-приложений тестов
  • 86.
    Жизненные циклы Maven ● Clean – очищает проект перед сборкой ● Default – собирает проект ● Site – создает сайт проекта со ссылками на зависимости, CI, тикетную систему и т.п.
  • 87.
    Сборка проекта. Командаmvn. ● Validate – проверить правильность проекта ● Compile – скомпилировать исходники ● Test – скомпилировать и выполнить тесты ● Package – упаковать скомпилированный код и исходники ● Verify – проверить, что код правильно упакован ● Install – установить пакеты в локальный репозиторий ● Deploy – выгрузить пакеты в удаленный репозиторий
  • 88.
    Управление зависимостями ●Секции <dependencies> и <dependencyManagement> ● Зависимость = groupId + artifactId + номер версии + scope ● Scope: compile, test, runtime, provided, system
  • 89.
    Версии пакетов. Релизыи снепшоты ● Снепшот – промежуточная версия пакета, используемая в разработке: 1.0-SNAPSHOT. Может быть бесконечно много снепшотов с одной и той же версией. ● Релиз – стабильная версия пакета, предназначенная для использования другими проектами: 1.0. Релиз всегда один. ● Порядок версий: 1.0-SNAPSHOT, 1.0, 1.1-SNAPSHOT, 1.1, 1.2-SNAPSHOT и т.д.
  • 90.
    Конфликт зависимостей. Дерево зависимостей. ● Для разрешения конфликтов зависимостей нужно построить дерево зависимостей ● Построение дерева зависимостей:
  • 91.
  • 92.
    Исключение зависимостей ●Исключение зависимостей – exclusions:
  • 93.
    Необязательные зависимости ●Такая зависимость не будет скачиваться в проектах, зависящих от данного ● Для того, чтобы пометить необязательную зависимость – секция optional:
  • 94.
    Плагины. Настройка билда. Изменение процесса билда – это изменение настроек отдельных плагинов в секции build/plugins.
  • 95.
    Maven Compiler Plugin ● Компилирует Java-код продукта и тестов ● Основная настройка – версия компилятора ● Настройка:
  • 96.
    Maven Source Plugin ● Упаковывает исходные коды проекта ● Настройка:
  • 97.
    Maven Dependency Plugin ● Разрешение зависимостей, построение дерева зависимостей ● Копирование, распаковка и другие операции с зависимостями
  • 98.
    Maven Jar Plugin ● Упаковывает файлы в jar-архив:
  • 99.
    Maven Assembly Plugin ● Сборка дистрибутивов продукта (например, zip-архив с jar, bash-скриптами и README)
  • 100.
    Maven Release Plugin ● Автоматизирует выкладку релизов ● Добавляются цели release:prepare и release:perform ● Настройка:
  • 101.
    Maven Surefire Plugin ● Выполнение тестов Junit или TestNG
  • 102.
    Maven Site Plugin ● Первоначальное назначение - сгенерировать сайт проекта ● Основное применение – генерация отчетов ● Настройка:
  • 103.
    Служебные файлы икаталоги ● Папка ~/.m2 – локальный репозиторий артефактов ● Файлы ~/.m2/settings.xml и /etc/maven/settings.xml, ~/.mavenrc и /etc/mavenrc – конфигурация Maven
  • 104.
    Профили. Settings.xml ●Профиль – способ изменять настройки билда, не изменяя pom.xml ● Профиль хранится в pom.xml или в settings.xml в секции profiles ● Использование профиля:
  • 105.
  • 106.
    Центральные репозитории артефактов ● Maven Central Repository (http://maven.org/) ● В папке репозитория: – maven-metadata.xml – jar, jar.md5, jar.sha1 – javadoc.jar, javadoc.jar.md5, javadoc.jar.sha1 – sources.jar, sources.jar.md5, sources.jar.sha1 – jar.asc, jar.asc.md5, jar.asc.sha1 ● Специализированные веб-приложения Sonatype Nexus и Artifactory
  • 107.
    Пример папки изцентрального репозитория
  • 108.
    Локальный репозиторий артефактов ● Кэширует данные с центрального репозитория ● В папке репозитория: – pom, pom.sha1 – jar, jar.sha1 – javadoc.jar, javadoc.jar.sha1 – sources.jar, sources.jar.sha1 ● За счет кэширования ускоряется выполнение билда
  • 109.
    Пример папки излокального репозитория
  • 110.
    Архетипы ● Архетип– готовый шаблон проекта ● Создание проекта по шаблону:
  • 111.
    Крутов Иван Skype:vania-pooh vania-pooh@yandex-team.ru