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

111

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

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

Автоматизация сборки Java проектов

Часть 1. Про инструменты сборки вообще

Часть 2. Про Maven

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

Библиотека HelloWorldЧасть 1. Про инструменты сборки вообще

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

Типичные проблемы

● Структура кода. Где и что хранится?

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

Типичные проблемы

● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка javac)?

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

Типичные проблемы

● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка javac)?● Как выполнить тесты?

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

Типичные проблемы

● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка javac)?● Как выполнить тесты?● Как разбить процесс сборки на стадии?

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

Типичные проблемы

● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка javac)?● Как выполнить тесты?● Как разбить процесс сборки на стадии?● Где хранить сторонние библиотеки?

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

Типичные проблемы

● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка javac)?● Как выполнить тесты?● Как разбить процесс сборки на стадии?● Где хранить сторонние библиотеки?● Как версионировать продукт?

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

Типичные проблемы

● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка javac)?● Как выполнить тесты?● Как разбить процесс сборки на стадии?● Где хранить сторонние библиотеки?● Как версионировать продукт?● Как передавать свои разработки другим людям?

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

Инструменты сборки

● Компиляция кода

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

Инструменты сборки

● Компиляция кода● Запуск тестов и определение степени покрытия

кода

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

Инструменты сборки

● Компиляция кода● Запуск тестов и определение степени покрытия

кода● Статический анализ кода: поиск ошибок в коде

без его выполнения

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

Инструменты сборки

● Компиляция кода● Запуск тестов и определение степени покрытия

кода● Статический анализ кода: поиск ошибок в коде

без его выполнения● Сборка архивов с бинарными файлами,

исходными кодами, документацией

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

Инструменты сборки

● Компиляция кода● Запуск тестов и определение степени покрытия

кода● Статический анализ кода: поиск ошибок в коде

без его выполнения● Сборка архивов с бинарными файлами,

исходными кодами, документацией● Построение отчетов

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

● Уменьшение числа рутинных ошибок

Польза от инструментов сборки

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

● Уменьшение числа рутинных ошибок● Уменьшение времени сборки проекта

Польза от инструментов сборки

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

● Уменьшение числа рутинных ошибок● Уменьшение времени сборки проекта● Можно хранить историю сборок проекта и

анализировать ошибки

Польза от инструментов сборки

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

● Уменьшение числа рутинных ошибок● Уменьшение времени сборки проекта● Можно хранить историю сборок проекта и

анализировать ошибки● В итоге – уменьшение затрат и улучшение

качества продукта

Польза от инструментов сборки

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

История развития инструментовсборки

https://github.com/autoschool/build-tools

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

Нет автоматизации

Недостатки

● Неудобно работать с большим число файлов● Не поддерживается условная логика● Платформозависимость● ...

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

Shell-скрипт

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

Shell-скрипт. Преимущества

● Можно выполнять много команд безкопирования

● Условная логика● Примитивное разбиение на стадии:

clean.sh, compile.sh, test.sh

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

Shell-скрипт. Недостатки

● Платформозависим● Нет единого подхода к описанию

процесса сборки

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

Make (1977 год)

Makefile

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

Make. Преимущества

● Единый формат описания процесса сборки

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

Make. Недостатки

● Платформозависим● Tab символы в Makefile● Нет поддержки Java задач, параметров,

плагинов

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

Apache Ant (2000 год)

build.xml

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

Apache Ant. Преимущества

● Поддержка Java-специфичных задач● Переносимость между платформами● Возможность расширения (плагины)● Параметризованные билды

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

Apache Ant. Недостатки

● Нет конвенций версионирования кода

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

Apache Ant. Недостатки

● Нет конвенций версионирования кода● Нет конвенций по расположению кода

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

Apache Ant. Недостатки

● Нет конвенций версионирования кода● Нет конвенций по расположению кода● Нет автоматического управления

зависимостями (их кладут в lib/)

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

Apache Ant. Недостатки

● Нет конвенций версионирования кода● Нет конвенций по расположению кода● Нет автоматического управления

зависимостями (их кладут в lib/)● Произвольный набор целей (нет жизненного

цикла)

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

Apache Ant. Недостатки

● Нет конвенций версионирования кода● Нет конвенций по расположению кода● Нет автоматического управления

зависимостями (их кладут в lib/)● Произвольный набор целей (нет жизненного

цикла)● Императивный стиль описания билда

(последовательность действий)

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

Apache Ant. Недостатки

● Нет конвенций версионирования кода● Нет конвенций по расположению кода● Нет автоматического управления

зависимостями (их кладут в lib/)● Произвольный набор целей (нет жизненного

цикла)● Императивный стиль описания билда

(последовательность действий)● Не поддерживает JUnit 4

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

Apache Ivy (2004)

ivy.xml

Решили проблему Ant:● Автоматическое управление зависимостями

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

Apache Maven (2004 год)

pom.xml

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

Apache Maven● Конвенции расположения кода, тестов,

ресурсов и т.д.

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

Apache Maven● Конвенции расположения кода, тестов,

ресурсов и т.д.● Четкий жизненный цикл: цели предопределены

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

Apache Maven● Конвенции расположения кода, тестов,

ресурсов и т.д.● Четкий жизненный цикл: цели предопределены● Способ поделиться кодом с другими –

удаленные репозитории зависимостей

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

Apache Maven● Конвенции расположения кода, тестов,

ресурсов и т.д.● Четкий жизненный цикл: цели предопределены● Способ поделиться кодом с другими –

удаленные репозитории зависимостей● Понятный механизм хранения зависимостей –

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

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

Apache Maven● Правила версионирования кода

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

Apache Maven● Правила версионирования кода● Поддержка многомодульных проектов

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

Apache Maven● Правила версионирования кода● Поддержка многомодульных проектов● Декларативный подход к описанию билда

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

Apache Maven● Правила версионирования кода● Поддержка многомодульных проектов● Декларативный подход к описанию билда● Модульная структура (даже простые действия

делают плагины)

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

Gradle (2009 год)

build.gradle

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

Gradle● Поддерживает основные возможности Maven

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

Gradle● Поддерживает основные возможности Maven● Файл build.gradle с DSL на Groovy

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

Gradle● Поддерживает основные возможности Maven● Файл build.gradle с DSL на Groovy● Инкрементальная компиляция

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

Gradle● Поддерживает основные возможности Maven● Файл build.gradle с DSL на Groovy● Инкрементальная компиляция● Использует те же удаленные репозитории, что

и Maven

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

Gradle● Поддерживает основные возможности Maven● Файл build.gradle с DSL на Groovy● Инкрементальная компиляция● Использует те же удаленные репозитории, что

и Maven● Эмулирует поведение Maven, но можно

задавать свой порядок целей

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

Gradle● Поддерживает основные возможности Maven● Файл build.gradle с DSL на Groovy● Инкрементальная компиляция● Использует те же удаленные репозитории, что

и Maven● Эмулирует поведение Maven, но можно

задавать свой порядок целей● Поддерживает плагины, несовместимые с

Maven

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

SBT (2011)

build.sbt, build.scala

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

SBT

Интерактивная консоль

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

SBT

● Полная поддержка компиляции Scala

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

SBT

● Полная поддержка компиляции Scala● Интерактивная консоль

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

SBT

● Полная поддержка компиляции Scala● Интерактивная консоль● Инкрементальная компиляция кода

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

SBT

● Полная поддержка компиляции Scala● Интерактивная консоль● Инкрементальная компиляция кода● Файлы build.sbt и build.scala (требуется

компиляция)

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

SBT

● Полная поддержка компиляции Scala● Интерактивная консоль● Инкрементальная компиляция кода● Файлы build.sbt и build.scala (требуется

компиляция)● Плагины, несовместимые с Maven

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

Leiningen

project.clj

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

Leiningen (Clojure)

● Файл project.clj на Clojure● Зависимости из репозиториев Maven● Альтернативный репозиторий Clojars

(http://clojars.org)

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

Инструменты сборки в других языках программирования

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

Rake (Ruby)

Rakefile

Система управления зависимостями – RubyGems

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

Grunt (Javascript)

Gruntfile.js

Система управления зависимостями – Bower

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

Cabal (Haskell)

*.cabal

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

Cabal

● Собственный репозиторий артефактов Hackage● Архивы с расширением *.tar.gz, а не *.jar.

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

Современная система сборки налюбом языке

● Основная цель – автоматизация действий скодом на локальной машине разработчика

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

Современная система сборки налюбом языке

● Основная цель – автоматизация действий скодом на локальной машине разработчика

● Автоматическое управление зависимостями

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

Современная система сборки налюбом языке

● Основная цель – автоматизация действий скодом на локальной машине разработчика

● Автоматическое управление зависимостями● Хранилища артефактов

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

Современная система сборки налюбом языке

● Основная цель – автоматизация действий скодом на локальной машине разработчика

● Автоматическое управление зависимостями● Хранилища артефактов● Четкий жизненный цикл

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

Современная система сборки налюбом языке

● Основная цель – автоматизация действий скодом на локальной машине разработчика

● Автоматическое управление зависимостями● Хранилища артефактов● Четкий жизненный цикл● Конвенции версионирования

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

Современная система сборки налюбом языке

● Основная цель – автоматизация действий скодом на локальной машине разработчика

● Автоматическое управление зависимостями● Хранилища артефактов● Четкий жизненный цикл● Конвенции версионирования● Конвенции расположения исходного кода

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

Часть 2. Про Maven

● Все pom.xml переопределяют “super pom”

Файл pom.xml

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

Часть 2. Про Maven

● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки

на исходные коды, CI, лицензия, разработчикии т.п.)

Файл pom.xml

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

Часть 2. Про Maven

● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки

на исходные коды, CI, лицензия, разработчикии т.п.)

● Список зависимостей

Файл pom.xml

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

Часть 2. Про Maven

● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки

на исходные коды, CI, лицензия, разработчикии т.п.)

● Список зависимостей● Список плагинов и их конфигурация

Файл pom.xml

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

Часть 2. Про Maven

● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки

на исходные коды, CI, лицензия, разработчикии т.п.)

● Список зависимостей● Список плагинов и их конфигурация● Профили

Файл pom.xml

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

Название проекта и параметры

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

Список модулей

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

Информация о проекте

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

Описание сборки проекта (плагины)

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

Зависимости

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

Именование директорий● src/ - все исходные коды● src/main – все, что касается продукта● src/test – все, что касается тестов

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

Именование директорий● src/main/java – Java-код продукта● src/main/resources – ресурсы продукта● src/main/webapp – файлы веб-приложений

продукта (стили, Javascript и т.п.)

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

Именование директорий● src/test/java – Java-код тестов● src/test/resources – ресурсы тестов● src/test/webapp – файлы веб-приложений

тестов

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

Жизненные циклы Maven

● Clean – очищает проект перед сборкой● Default – собирает проект● Site – создает сайт проекта со ссылками на

зависимости, CI, тикетную систему и т.п.

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

Сборка проекта. Команда mvn.

● Validate – проверить правильность проекта● Compile – скомпилировать исходники● Test – скомпилировать и выполнить тесты● Package – упаковать скомпилированный код и исходники● Verify – проверить, что код правильно упакован● Install – установить пакеты в локальный репозиторий● Deploy – выгрузить пакеты в удаленный репозиторий

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

Управление зависимостями

● Секции <dependencies> и<dependencyManagement>

● Зависимость = groupId + artifactId + номерверсии + scope

● Scope: compile, test, runtime, provided, system

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

Версии пакетов. Релизы и снепшоты

● Снепшот – промежуточная версия пакета ,используемая в разработке: 1.0-SNAPSHOT. Может быть бесконечно много снепшотов с одной и той жеверсией.

● Релиз – стабильная версия пакета, предназначеннаядля использования другими проектами: 1.0. Релизвсегда один.

● Порядок версий: 1.0-SNAPSHOT, 1.0, 1.1-SNAPSHOT,1.1, 1.2-SNAPSHOT и т.д.

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

Конфликт зависимостей. Деревозависимостей.

● Для разрешения конфликтов зависимостейнужно построить дерево зависимостей

● Построение дерева зависимостей:

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

Пример дерева зависимостей

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

Исключение зависимостей

● Исключение зависимостей – exclusions:

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

Необязательные зависимости

● Такая зависимость не будет скачиваться впроектах, зависящих от данного

● Для того, чтобы пометить необязательнуюзависимость – секция optional:

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

Плагины. Настройка билда.

Изменение процесса билда – это изменениенастроек отдельных плагинов в секцииbuild/plugins.

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

Maven Compiler Plugin

● Компилирует Java-код продукта и тестов● Основная настройка – версия компилятора● Настройка:

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

Maven Source Plugin

● Упаковывает исходные коды проекта● Настройка:

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

Maven Dependency Plugin● Разрешение зависимостей, построение дерева зависимостей● Копирование, распаковка и другие операции с

зависимостями

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

Maven Jar Plugin

● Упаковывает файлы в jar-архив:

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

Maven Assembly Plugin

● Сборка дистрибутивов продукта (например,zip-архив с jar, bash-скриптами и README)

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

Maven Release Plugin

● Автоматизирует выкладку релизов● Добавляются цели release:prepare и

release:perform● Настройка:

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

Maven Surefire Plugin

● Выполнение тестов Junit или TestNG

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

Maven Site Plugin

● Первоначальное назначение - сгенерироватьсайт проекта

● Основное применение – генерация отчетов● Настройка:

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

Служебные файлы и каталоги

● Папка ~/.m2 – локальный репозиторий артефактов

● Файлы ~/.m2/settings.xml и /etc/maven/settings.xml,~/.mavenrc и /etc/mavenrc – конфигурация Maven

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

Профили. Settings.xml

● Профиль – способ изменять настройки билда,не изменяя pom.xml

● Профиль хранится в pom.xml или в settings.xmlв секции profiles

● Использование профиля:

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

Пример профиля

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

Центральные репозиторииартефактов

● 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

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

Пример папки из центральногорепозитория

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

Локальный репозиторий артефактов

● Кэширует данные с центрального репозитория● В папке репозитория:

– pom, pom.sha1

– jar, jar.sha1

– javadoc.jar, javadoc.jar.sha1

– sources.jar, sources.jar.sha1

● За счет кэширования ускоряется выполнениебилда

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

Пример папки из локальногорепозитория

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

Архетипы

● Архетип – готовый шаблон проекта● Создание проекта по шаблону:

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

Крутов ИванSkype: vania-pooh

[email protected]