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

Post on 07-Jul-2015

397 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Автоматизация сборки 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

vania-pooh@yandex-team.ru

top related