3. Жизненный цикл в Gradle:
1.Фаза инициализации (Initialization phase) - Gradle решает какие
проекты будут участвовать в сборке.
2.Фаза конфигурирования (Configuration phase) - объекты собраны
во внутреннюю объектную модель (DAG - directed acyclic graph).
testTask {
println 'Config Task';
}
3.Фаза исполнения (Execution phase) - задачи сборки выполняются
в порядке разрешения зависимостей.
testTask << {
println 'Execute Task'
}
4. Жизненный цикл в Gradle:
Примечание:
весь код описанный как конфигурационный выполняется каждый
раз при запуске файла сборки Gradle, вне зависимости от того,
какое задание выполняется
5. Стандартное задание в Gradle:
Каждое задание в Gradle имеет тип,по-умолчанию это тип
стандартного задания (DefaultTask), на подобии java.lang.Object в
Java коде. Стандартное задание на самом деле ничего не делает,
а только содержит методы для взаимодейтсвия с объектной
моделью проекта Gradle.
Каждое задание в Gradle имеет следующие методы:
1.dependsOn(task)
2.doFirst(closure) {
3.doLast(closure) для обозначения в
println 'hi!' Groovy используется
4.onlyIf(closure) } термин "closure"
8. dependsOn(task)
Вызвать это метод можно и другими способами:
task testTask(dependsOn: dependsTask)
testTask.dependsOn dependsTask
dependsOn << dependsTask
dependsOn 'dependsTask'
testTask.dependsOn dependsTask1, dependsTask2
task testTask(dependsOn: [dependsTask1, dependsTask2])
9. doFirst(closure)
Добавляет блок выполняемого кода, который будем вызван перед
началом выполнения текущего задания.
task testTask << {
println 'Task action'
>>gradle testTask
} :testTask
testTask.doFirst{ Task prepare
println 'Task prepare' Task action
}
10. doFirst(closure)
Данный метод может быть вызван внутри конфигурационного
блока:
task testTask {
doFirst{
println 'doFirst method' >>gradle testTask
} :testTask
} doFirst method
testTask << { Execute testTask
println 'Execute testTask'
}
11. doFirst(closure)
Примечание:
повторные вызовы метода doFirst являются аддативными.
Каждый предыдущий вызов исполняемого кода сохраняется, и
каждый новый фрагмент исполняемого кода добавляется в
начало списка для выполнения.
13. doLast(closure)
Добавляет блок выполняемого кода, который будем вызван после
выполнения текущего задания.
task testTask << {
println 'Task action'
>>gradle testTask
} :testTask
testTask.doLast{ Task action
println 'Task after' Task after
}
14. doLast(closure)
Примечание:
повторные вызовы метода doLast являются аддативными.
Каждый предыдущий вызов исполняемого кода сохраняется, и
каждый новый фрагмент исполняемого кода добавляется в
конец списка для выполнения.
16. onlyIf(closure)
Позволяет описать предикат оперделяющий условие, когда задача
может быть выполнена. Значение предиката является значением
исполняемого кода в теле метода onlyIf
task testTask << { >>gradle testTask
println 'Execute testTask' :testTask SKIPPED
}
testTask.onlyIf {
System.properties['isLoad'] == 'true' >>gradle -DisLoad=true
testTask
} :testTask
Execute testTask
17. onlyIf(closure)
Примечание:
использование данного метода позволяет переключаться между
заданими в зависимости от определенных условий .
Возможность использования Groovy кода позволяет в теле
метода onlyIf читать файлы, вызывать веб-сервисы, проверять
учетные записи, выполнять разнообразные операции.
18. Свойства стандартного задания в Gradle:
Стандартное задание Gradle имеет следующие свойства:
1.didWork
2.enabled
3.path
4.logger
5.logging
6.description
7.temporaryDir
19. didWork
Логическое свойство показывающее успешно ли выполнена
задача. Пользователь может самостоятельно установить значение
этого свойства, для отображения результата сборки кода.
Для обозначения успешности своих действий значение данного
свойства могут устанавливать некоторые стандартные задачи
Gradle, такие как:
1.Compile
2.Copy
3.Delete
20. enabled
Логическое свойство показывающее возможно ли выполнение
текущего задания. Для запрета выполнения задания значение
данного свойства должно быть false.
task testTask << {
>>gradle testTask
println 'Execute testTask'
:testTask
} Execute testTask
testTask.enabled = true
task testTask << {
println 'Execute testTask' >>gradle testTask
:testTask SKIPPED
}
testTask.enabled = false
21. path
Строковое свойство содержащее полный путь к заданию.
Значение данного свойства для файлов сборки верхнего уровня
совпадает с именем задания, а для заданий которые расположены
в подзаданиях формируется по следующему правилу:
:STN:TN
STN (Subtask name) - имя подзадания
TN (Task name) - имя задания в подзадании
22. logger
Свойство хранящее ссылку на внутренний логгер Gradle. Данный
логгер реализует интерфейс org.slf4j.Logger с добавлением
нескольких дополнительных уровней логирования.
Уровни логгера Gradle:
1.DEBUG
2.INFO
3.LIFECYCLE
4.WARN
5.QUIET
6.ERROR
23. logging
Свойство представляющее уровень логирования встроенного
логгера Gradle. Значение свойства logging.level может быть
прочитано или записано для смены уровня логгирования при
сборке.
24. description
Строковое свойство описывающее цель данного задания.
Значение свойства можно задать несколькими способами:
task testTask(description: 'Study Gradle') << {
println 'Test task'
}
task testTask << {
println 'Test task'
}
testTask {
description = 'Study Gradle'
}
25. description
Один из способов задания свойства description:
task testTask << {
println 'Test task'
}
testTask.description = 'Study Gradle'
26. temporaryDir
Свойство возвращает объект типа File, который указывает
временный каталог для текущего файла сборки.
Данный каталог используется для задач нуждающихся во
временном сохранении результатов работы, либо для задач
обработки файлов внутри задачи.
27. Типы заданий в Gradle
Каждое задание в Gradle имеет тип, кроме стандартного типа
DefaultTask, есть типы задач для архивирования, выполнения
программ и многого другого. Определение типа задания подобно
механизму наследования в объектно-ориентированных языках
программирования.
В число наиболее важных типов заданий входят следующие:
1.Copy
2.Jar
3.JavaExec
28. Copy
Данное задание копирует файлы с одного места в другое.
task copyFiles(type: Copy) {
откуда
from 'resources'
куда
into 'target'
что
include '**/*.xml', '**/*.txt', '**/*.properties'
}
Замечание:
from, into и include методы наследуются от задания Copy
29. Jar
Создает Jar файл из исходных файлов. Имеет широкие
возможности для конфигурирования.
apply plugin: 'java'
task customJar(type: Jar) {
manifest {
определяем
attributes firstKey: 'firstValue', пользовательские
secondKey: 'secondValue' аттрибуты для
} файла манифеста
archiveName = 'hello.jar'
destinationDir = file("${buildDir}/jars") имя архива
from sourceSets.main.classes куда сохранить
} какие файлы
30. Jar
Примечание:
задание Jar наследуется от задания Copy. Тип значения
параметра distinationDir ожидается java.io.File, поэтому в
примере используется метод file(), который всегда доступен
внутри файла сборки Gradle. Метод file() переводит строковый
объект указывающий каталог назначения, в объект типа File.
31. JavaExec
Выполняет Java класс который содержит метод main().
task encode(type: JavaExec) {
main = 'org.example.Greeting' класс с main()
args = "Name Surname LastName".split().toList()
classpath sourceSets.main.classesDir
classpath configurations.runtime
}
параметры classpath
аргументы передаваемые в метод main()
32. Gradle & Ant
За счет использования функциональности AntBuilder из Groovy,
использование Ant в Gradle проще, чем непосредственно
использование Ant. Gradle иногда называют Ant на основе Groovy.
Gradle переносит все из пространства имен Ant в свое
пространство имен.
Для вызова задачи Ant достачно:
ant.<имя_задачи>
33. Gradle & Ant:свойства
Ant свойство:
<project>
<property name="appversion" value="1.0"/>
</project>
Gradle переменная:
int appversion = 1.0
34. Gradle & Ant:пользовтельские задачи
Использование стандартных задача Ant в Gradle решается просто,
не намного сложнее использование пользовательских задач.
Для этого достаточно использовать taskdef метод из AntiBuilder.
task testTask << {
ant.taskdef(name: 'testAntTask',
classname: 'org.example.testAntTask',
classpath: configurations.testAnt.asPath)
ant.testAntTask(shortFilenames: 'true', failonruleviolation: 'true',
rulesetfiles: file('src/tools/basic-rules.xml').toURI().toString()) {
formatter(type: 'text', toConsole: 'true')
fileset(dir: 'src/main/java')
}
}
35. Gradle & Ant:комплексные задачи
Пример использования комплексного задания в Ant:
<project>
<target name="zipsourceInAnt">
<zip destfile='samples-from-ant.zip'>
<fileset dir= 'samples'>
<include name='**.txt'/>
</fileset>
</zip>
</target>
</project>
36. Gradle & Ant:комплексные задачи
Пример использования комплексного задания в Gradle:
task zipsourceInGradle << {
ant.zip(destfile: 'samples-from-gradle.zip') {
fileset(dir: 'samples') {
include(name: '**.txt')
}
}
}
38. Gradle & Ant:интеграция
Задачи сборки Ant могут использоваться в качестве dependsOn в
Gradle,а задачи сборки Gradle цели могут использоваться как
зависимые поля в Ant. Главное условие интеграции Gradle и Ant
то, что Gradle должен быть средой выполнения и
инициализировать начало сборки.
39. Gradle & Ant: AntBuilder
Мощь использования Ant в Gradle не ограничена рассмотренными
ранее подходами. Использование AntBuilder из Groovy для Ant-
заданий дает возможность использовать все парадигмы и
конструкции Groovy во время выполнения Ant-заданий.
40. Gradle & Ant: classpath
Ant classpath:
<project>
<!-- Classpath created by Ant, then used by Gradle -->
<path id="antPathToLibs1" location="antlibs"/>
<path id="antPathToLibs2" location="antlibs"/>
</project>
42. Gradle & Ant: репозитории
Gradle позволяет полчить доступ к Ivy репозиторим. Для этого
достаточно задать параметры репозитория в closure под именем
repositories.
repositories {
ivy {
name = 'ivyRepo'
artifactPattern "http://repo.gradleware.org/[organisation]/
[module]/
[revision]/[artifact]-[revision].[ext]"
}
}
43. Gradle & Maven: plugin: 'java'
что делает
Для интеграции Maven и Gradle можно использовать плагин java.
Данный плагин подключается следующей строкой:
apply plugin: 'java'
и выполняет следующие действия:
1.скачивает все объявленные зависимости
(~/.gradle/cache)
2.компилирует код
(src/main/java)
3.сохраняет скомпилированные классы
(build/classes/main)
4.пытается скомпилировать и запустить все unit-тесты
44. Gradle & Maven: plugin: 'java'
что делает
5.сохраняет отчет результатов тестов в XML
(build/reports/tests/)
6.генерирует манифест файл MANIFEST.MF
(build/tmp/jar/MANIFEST.MF)
7.сохраняет все скомпилированные классы вместе с файлом
манифеста в JAR архив
(build//maven-gradle-comparison-simple.jar)
45. Gradle & Maven: plugin: 'java'
задачи сборки
1.assemble - собирает все Jar, War, Zip, and Tar архивы
2.build - собирает и тестирует текущий проект
3.buildDependents - собирает и тестирует текущий проект, а
также все проекты которые зависят от него
4.buildNeeded - собирает и тестирует текущий проект, а также все
проекты от которых он зависит
5.classes - собирает main-классы
6.clean - удаляет каталог сборки
7.jar - cобирает jar-архив содержащий main-классы
8.testClasses - cобирает классы для тестов
46. Gradle & Maven: plugin: 'java'
задачи проверки
1.check - выполняет все проверки
2.test - выполняет все unit-тесты
47. Gradle & Maven: plugin: 'java'
задачи создания документации
1.javadoc - создает Javadoc API документацию для исходного кода.
48. Gradle & Maven: свойства
Maven Gradle Default
groupId group blank
artifactId name имя каталога проекта
arhivesBaseName
version version неопределенно
name N/A N/A
description description null
49. Gradle & Maven: зависимости
Библиотеки объявленные как внешние зависимости описываются в
closure с именем dependencies.
dependencies {
testCompile group: 'junit',
name: 'junit',
version: '4.8.+'
compile group: 'commons-beanutils',
name: 'commons-beanutils',
version: '1.8.3'
}
50. Gradle & Maven: зависимости
Зависимости возможно добавить в одном из следующих
контекстов:
1.compile
2.default
3.testCompile
4.testRuntime
5.archives
6.runtime
Примечание: дополнительно необходимо подключить плагин
Groovy: apply plugin: 'groovy'
51. Gradle & Maven: репозитории
Gradle предоставляет средства для доступа как Ivy, так и Maven
репозиториям. Репозитории описываются в closure с именем
repositories.
repositories {
mavenCentral()
}
Примечание:mavenCentral() - предопределенный метод для
доступа к центральному репозиторию Maven.
53. Gradle & Maven: репозитории
В качестве репозитория так же можно использовать каталог.
repositories {
add(new FileSystemResolver()) {
name = "repo"
addArtifactPattern("$rootDir/repo/[organization]/[modul]-
[revision].[ext]")
addIvyPattern("$rootDir/repo/[organization]/ivy-[module]-
[revision].xml")
checkmodified = true
}
}
54. Gradle & Maven: Multiple Source
В качестве каталога с исходными кодом Gradle использует каталог
src/main/java по-умолчанию. Спискок каталогов с исходным кодом
может быть легко расширен, для этого используется свойство
sourceSets java-плагина.
apply plugin: 'java'
sourceSets.main.java.srcDirs =
["src/main/java",
"srcAdditional/main/java"]
sourceSets.main.java.srcDirs 'srcAdditionalTwo/main/java'
56. Gradle & Maven:
установка в локальный репозиторий
Для установки артифакта в локальный репозиторий, по анологии с
Maven (mvn install), в Gradle достаточно выполнить задание:
gradle install
57. Gradle & Maven:
публикация в репозиторий
Для публикации артифакта в локальный репозиторий необходимо
подключить maven-плагин и настроить параметры подключения.
apply plugin: 'java'
apply plugin: 'maven'
group = 'com.gradleware.samples'
uploadArchives {
repositories.mavenDeployer {
repository(url: "file:///gradle/study/maven/mytemprepo/")
}
}