Иван Крутов - Автоматизация сборки Java-проекта
Transcript of Иван Крутов - Автоматизация сборки Java-проекта
Автоматизация сборки Java проектов
Часть 1. Про инструменты сборки вообще
Часть 2. Про Maven
Библиотека HelloWorldЧасть 1. Про инструменты сборки вообще
Типичные проблемы
● Структура кода. Где и что хранится?
Типичные проблемы
● Структура кода. Где и что хранится?● Как скомпилировать код (поддержка 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 переопределяют “super pom”
Файл pom.xml
Часть 2. Про Maven
● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки
на исходные коды, CI, лицензия, разработчикии т.п.)
Файл pom.xml
Часть 2. Про Maven
● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки
на исходные коды, CI, лицензия, разработчикии т.п.)
● Список зависимостей
Файл pom.xml
Часть 2. Про Maven
● Все pom.xml переопределяют “super pom”● Описание проекта (название, версия, ссылки
на исходные коды, CI, лицензия, разработчикии т.п.)
● Список зависимостей● Список плагинов и их конфигурация
Файл pom.xml
Часть 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