SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
Gradle
ilya.lapitan@gmail.com
Установка:
1.Скачиваем архив с Gradle:
wget http://downloads.gradle.org/distributions/gradle-1.2-bin.zip
2.Распаковываем архив:
sudo unzip -q gradle-1.2-bin.zip -d /usr/local/
3.Устнавливаем системные переменные:
echo "export GRADLE_HOME=/usr/local/gradle-1.2" >> .profile
echo "export PATH=$PATH:$GRADLE_HOME/bin" >> .profile
4.Проверяем:
gradle -version
Жизненный цикл в Gradle:
1.Фаза инициализации (Initialization phase) - Gradle решает какие
проекты будут участвовать в сборке.
2.Фаза конфигурирования (Configuration phase) - объекты собраны
во внутреннюю объектную модель (DAG - directed acyclic graph).
testTask {
    println 'Config Task';
}
3.Фаза исполнения (Execution phase) - задачи сборки выполняются
в порядке разрешения зависимостей.
testTask << {
    println 'Execute Task'
}
Жизненный цикл в Gradle:
Примечание:
весь код описанный как конфигурационный выполняется каждый
раз при запуске файла сборки Gradle, вне зависимости от того,
какое задание выполняется
Стандартное задание в 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"
dependsOn(task)
Добавляет задание-зависимость для текущего задания.

task dependsTask << {
    println 'dependsTask'
}
                                        >>gradle testTask
task testTask {                         :dependsTask
    dependsOn dependsTask               dependsTask
}                                       :testTask
testTask << {                           testTask
    println 'testTask'
}
dependsOn(task)
Примечание:
задание-зависимость выполняется всегда перед текущим
заданием и должно быть описано перед ним. Задание-
зависимость для текущего задания определяется на фазе
конфигурирования.
dependsOn(task)
Вызвать это метод можно и другими способами:
task testTask(dependsOn: dependsTask)
testTask.dependsOn dependsTask
dependsOn << dependsTask
dependsOn 'dependsTask'

testTask.dependsOn dependsTask1, dependsTask2
task testTask(dependsOn: [dependsTask1, dependsTask2])
doFirst(closure)
Добавляет блок выполняемого кода, который будем вызван перед
началом выполнения текущего задания.

task testTask << {
    println 'Task action'
                                  >>gradle testTask
}                                 :testTask
testTask.doFirst{                 Task prepare
    println 'Task prepare'        Task action
}
doFirst(closure)
Данный метод может быть вызван внутри конфигурационного
блока:
task testTask {
    doFirst{
        println 'doFirst method'   >>gradle testTask
    }                              :testTask
}                                  doFirst method
testTask << {                      Execute testTask
    println 'Execute testTask'
}
doFirst(closure)
Примечание:
повторные вызовы метода doFirst являются аддативными.
Каждый предыдущий вызов исполняемого кода сохраняется, и
каждый новый фрагмент исполняемого кода добавляется в
начало списка для выполнения.
doFirst(closure)
task testTask <<{
    println 'Execute testTask'
}                                    >>gradle testTask
testTask.doFirst{                    :testTask
    println 'doFirst definition 1'   doFirst definition 2
}                                    doFirst definition 1
                                     Execute testTask
testTask.doFirst{
    println 'doFirst definition 2'
}
doLast(closure)
Добавляет блок выполняемого кода, который будем вызван после
выполнения текущего задания.

task testTask << {
    println 'Task action'
                                  >>gradle testTask
}                                 :testTask
testTask.doLast{                  Task action
    println 'Task after'          Task after
}
doLast(closure)
Примечание:
повторные вызовы метода doLast являются аддативными.
Каждый предыдущий вызов исполняемого кода сохраняется, и
каждый новый фрагмент исполняемого кода добавляется в
конец списка для выполнения.
doLast(closure)
task testTask <<{
    println 'Execute testTask'
}                                   >>gradle testTask
                                    :testTask
testTask.doLast{                    Execute testTask
    println 'doLast definition 1'   doLast definition 1
}                                   doLast definition 2
testTask.doLast{
    println 'doLast definition 2'
}
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
onlyIf(closure)
Примечание:
использование данного метода позволяет переключаться между
заданими в зависимости от определенных условий .
Возможность использования Groovy кода позволяет в теле
метода onlyIf читать файлы, вызывать веб-сервисы, проверять
учетные записи, выполнять разнообразные операции.
Свойства стандартного задания в Gradle:
Стандартное задание Gradle имеет следующие свойства:
1.didWork
2.enabled
3.path
4.logger
5.logging
6.description
7.temporaryDir
didWork
Логическое свойство показывающее успешно ли выполнена
задача. Пользователь может самостоятельно установить значение
этого свойства, для отображения результата сборки кода.
Для обозначения успешности своих действий значение данного
свойства могут устанавливать некоторые стандартные задачи
Gradle, такие как:
1.Compile
2.Copy
3.Delete
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
path
Строковое свойство содержащее полный путь к заданию.
Значение данного свойства для файлов сборки верхнего уровня
совпадает с именем задания, а для заданий которые расположены
в подзаданиях формируется по следующему правилу:
:STN:TN
STN (Subtask name) - имя подзадания
TN (Task name) - имя задания в подзадании
logger
Свойство хранящее ссылку на внутренний логгер Gradle. Данный
логгер реализует интерфейс org.slf4j.Logger с добавлением
нескольких дополнительных уровней логирования.
Уровни логгера Gradle:
1.DEBUG
2.INFO
3.LIFECYCLE
4.WARN
5.QUIET
6.ERROR
logging
Свойство представляющее уровень логирования встроенного
логгера Gradle. Значение свойства logging.level может быть
прочитано или записано для смены уровня логгирования при
сборке.
description
Строковое свойство описывающее цель данного задания.
Значение свойства можно задать несколькими способами:
task testTask(description: 'Study Gradle') << {
    println 'Test task'
}
task testTask << {
    println 'Test task'
}
testTask {
    description = 'Study Gradle'
}
description
Один из способов задания свойства description:
task testTask << {
    println 'Test task'
}
testTask.description = 'Study Gradle'
temporaryDir
Свойство возвращает объект типа File, который указывает
временный каталог для текущего файла сборки.
Данный каталог используется для задач нуждающихся во
временном сохранении результатов работы, либо для задач
обработки файлов внутри задачи.
Типы заданий в Gradle
Каждое задание в Gradle имеет тип, кроме стандартного типа
DefaultTask, есть типы задач для архивирования, выполнения
программ и многого другого. Определение типа задания подобно
механизму наследования в объектно-ориентированных языках
программирования.
В число наиболее важных типов заданий входят следующие:
1.Copy
2.Jar
3.JavaExec
Copy
Данное задание копирует файлы с одного места в другое.
task copyFiles(type: Copy) {
                                                      откуда
    from 'resources'
                                                      куда
    into 'target'
                                                      что
    include '**/*.xml', '**/*.txt', '**/*.properties'
}

Замечание:
from, into и include методы наследуются от задания Copy
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                куда сохранить
}                                               какие файлы
Jar
Примечание:
задание Jar наследуется от задания Copy. Тип значения
параметра    distinationDir ожидается java.io.File, поэтому в
примере используется метод file(), который всегда доступен
внутри файла сборки Gradle. Метод file() переводит строковый
объект указывающий каталог назначения, в объект типа File.
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()
Gradle & Ant
За счет использования функциональности AntBuilder из Groovy,
использование Ant в Gradle проще, чем непосредственно
использование Ant. Gradle иногда называют Ant на основе Groovy.
Gradle переносит все из пространства имен Ant в свое
пространство имен.
Для вызова задачи Ant достачно:
ant.<имя_задачи>
Gradle & Ant:свойства
Ant свойство:
<project>
    <property name="appversion" value="1.0"/>
</project>

Gradle переменная:
int appversion = 1.0
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')
    }
}
Gradle & Ant:комплексные задачи
Пример использования комплексного задания в Ant:
<project>
    <target name="zipsourceInAnt">
        <zip destfile='samples-from-ant.zip'>
            <fileset dir= 'samples'>
                 <include name='**.txt'/>
            </fileset>
        </zip>
    </target>
</project>
Gradle & Ant:комплексные задачи
Пример использования комплексного задания в Gradle:
task zipsourceInGradle << {
        ant.zip(destfile: 'samples-from-gradle.zip') {
            fileset(dir: 'samples') {
                 include(name: '**.txt')
            }
        }
}
Gradle & Ant:импорт файла сборки
Импорт файла сборки Ant:
ant.importBuild 'build.xml'
Gradle & Ant:интеграция
Задачи сборки Ant могут использоваться в качестве dependsOn в
Gradle,а задачи сборки Gradle цели могут использоваться как
зависимые поля в Ant. Главное условие интеграции Gradle и Ant
то, что Gradle должен быть средой выполнения и
инициализировать начало сборки.
Gradle & Ant: AntBuilder
Мощь использования Ant в Gradle не ограничена рассмотренными
ранее подходами. Использование AntBuilder из Groovy для Ant-
заданий дает возможность использовать все парадигмы и
конструкции Groovy во время выполнения Ant-заданий.
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>
Gradle & Ant: classpath
Gradle classpath:
ant.importBuild 'build.xml'
defaultTasks = ['gradleBuild']
repositories {
    flatDir name: 'localRepository1',
        dirs: ant.references['antPathToLibs1']
    flatDir name: 'localRepository2',
        dirs: ant.references.antPathToLibs2
    flatDir name: 'localRepository3',
        dirs: "antlibs"
}
Gradle & Ant: репозитории
Gradle позволяет полчить доступ к Ivy репозиторим. Для этого
достаточно задать параметры репозитория в closure под именем
repositories.
repositories {
   ivy {
       name = 'ivyRepo'
       artifactPattern "http://repo.gradleware.org/[organisation]/
       [module]/
       [revision]/[artifact]-[revision].[ext]"
   }
}
Gradle & Maven: plugin: 'java'
что делает
Для интеграции Maven и Gradle можно использовать плагин java.
Данный плагин подключается следующей строкой:
apply plugin: 'java'
и выполняет следующие действия:
1.скачивает все объявленные зависимости
(~/.gradle/cache)
2.компилирует код
(src/main/java)
3.сохраняет скомпилированные классы
(build/classes/main)
4.пытается скомпилировать и запустить все unit-тесты
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)
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обирает классы для тестов
Gradle & Maven: plugin: 'java'
задачи проверки
1.check - выполняет все проверки
2.test - выполняет все unit-тесты
Gradle & Maven: plugin: 'java'
задачи создания документации
1.javadoc - создает Javadoc API документацию для исходного кода.
Gradle & Maven: свойства

    Maven            Gradle              Default
    groupId           group               blank
    artifactId         name        имя каталога проекта
                 arhivesBaseName
    version          version         неопределенно
     name              N/A                 N/A
   description      description            null
Gradle & Maven: зависимости
Библиотеки объявленные как внешние зависимости описываются в
closure с именем dependencies.
dependencies {
    testCompile group: 'junit',
                  name: 'junit',
                 version: '4.8.+'
    compile group: 'commons-beanutils',
            name: 'commons-beanutils',
             version: '1.8.3'
}
Gradle & Maven: зависимости
Зависимости возможно добавить в одном из следующих
контекстов:
1.compile
2.default
3.testCompile
4.testRuntime
5.archives
6.runtime

Примечание: дополнительно необходимо подключить плагин
Groovy: apply plugin: 'groovy'
Gradle & Maven: репозитории
Gradle предоставляет средства для доступа как Ivy, так и Maven
репозиториям. Репозитории описываются в closure с именем
repositories.
repositories {
   mavenCentral()
}

Примечание:mavenCentral() - предопределенный метод для
доступа к центральному репозиторию Maven.
Gradle & Maven: репозитории
Репозиторий можнот подключить по URL.
repositories {
   mavenRepo(urls:
   'http://repo.gradle.org/gradle/libs-releases-local')
}
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
    }
}
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'
Gradle & Maven: задание по-умолчанию
Maven
<build>
    <defaultGoal>clean install</defaultGoal>
</build>

Gradle
apply plugin: 'java'
defaultTasks = ['clean', 'install']

или

defaultTasks 'clean', 'install'
Gradle & Maven:
установка в локальный репозиторий
Для установки артифакта в локальный репозиторий, по анологии с
Maven (mvn install), в Gradle достаточно выполнить задание:
gradle install
Gradle & Maven:
публикация в репозиторий
Для публикации артифакта в локальный репозиторий необходимо
подключить maven-плагин и настроить параметры подключения.
apply plugin: 'java'
apply plugin: 'maven'
group = 'com.gradleware.samples'
uploadArchives {
   repositories.mavenDeployer {
       repository(url: "file:///gradle/study/maven/mytemprepo/")
   }
}
Продолжение следует...
Больше информации:http://www.gradle.org/

Contenu connexe

Tendances

Tendances (19)

C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Thread
ThreadThread
Thread
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Java 8. Thread pools
Java 8. Thread poolsJava 8. Thread pools
Java 8. Thread pools
 
Java threads - part 2
Java threads - part 2Java threads - part 2
Java threads - part 2
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметки
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 

En vedette

Javaone 2013 moscow gradle
Javaone 2013 moscow gradleJavaone 2013 moscow gradle
Javaone 2013 moscow gradle
Evgeny Borisov
 
Разработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring FrameworkРазработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring Framework
CUSTIS
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
beloslab
 

En vedette (20)

Google советы успешного поиска
 Google советы успешного поиска Google советы успешного поиска
Google советы успешного поиска
 
Linux commands
Linux commandsLinux commands
Linux commands
 
Javaone 2013 moscow gradle
Javaone 2013 moscow gradleJavaone 2013 moscow gradle
Javaone 2013 moscow gradle
 
Стратегии выполнения тестов в Gradle
Стратегии выполнения тестов в GradleСтратегии выполнения тестов в Gradle
Стратегии выполнения тестов в Gradle
 
Bash scripting
 Bash scripting Bash scripting
Bash scripting
 
Enter the gradle
Enter the gradleEnter the gradle
Enter the gradle
 
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский..."IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
 
Gradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для AndroidGradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для Android
 
Архивы в Java
Архивы в JavaАрхивы в Java
Архивы в Java
 
Apache2
Apache2Apache2
Apache2
 
Learn Java with Coursera
Learn Java  with  CourseraLearn Java  with  Coursera
Learn Java with Coursera
 
Amazon S3
Amazon S3 Amazon S3
Amazon S3
 
Apache Camel Lifecycle
Apache Camel LifecycleApache Camel Lifecycle
Apache Camel Lifecycle
 
Разработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring FrameworkРазработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring Framework
 
Maven lifecycle
Maven lifecycleMaven lifecycle
Maven lifecycle
 
Apache Camel + Apache ActiveMQ persistence
Apache Camel + Apache ActiveMQ persistenceApache Camel + Apache ActiveMQ persistence
Apache Camel + Apache ActiveMQ persistence
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
 
Spring in java
Spring in javaSpring in java
Spring in java
 
Gradle
GradleGradle
Gradle
 

Similaire à Gradle

Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Ilya Shalyapin
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Drupal code sprint для новичков
Drupal code sprint для новичковDrupal code sprint для новичков
Drupal code sprint для новичков
Ovadiah Myrgorod
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Andrey Rebrov
 
Как не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кодаКак не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кода
tfmailru
 

Similaire à Gradle (20)

9 free rtos
9 free rtos9 free rtos
9 free rtos
 
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
 
Разработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconruРазработка через тестирование в Python и Django #pyconru
Разработка через тестирование в Python и Django #pyconru
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Lec 14
Lec 14Lec 14
Lec 14
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Drupal code sprint для новичков
Drupal code sprint для новичковDrupal code sprint для новичков
Drupal code sprint для новичков
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
бегун
бегунбегун
бегун
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшнаCI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
 
Sumin
SuminSumin
Sumin
 
Как не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кодаКак не утонуть в мегабайтах JS-кода
Как не утонуть в мегабайтах JS-кода
 
Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...
 

Dernier

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 

Dernier (9)

MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 

Gradle

  • 2. Установка: 1.Скачиваем архив с Gradle: wget http://downloads.gradle.org/distributions/gradle-1.2-bin.zip 2.Распаковываем архив: sudo unzip -q gradle-1.2-bin.zip -d /usr/local/ 3.Устнавливаем системные переменные: echo "export GRADLE_HOME=/usr/local/gradle-1.2" >> .profile echo "export PATH=$PATH:$GRADLE_HOME/bin" >> .profile 4.Проверяем: gradle -version
  • 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"
  • 6. dependsOn(task) Добавляет задание-зависимость для текущего задания. task dependsTask << { println 'dependsTask' } >>gradle testTask task testTask { :dependsTask dependsOn dependsTask dependsTask } :testTask testTask << { testTask println 'testTask' }
  • 7. dependsOn(task) Примечание: задание-зависимость выполняется всегда перед текущим заданием и должно быть описано перед ним. Задание- зависимость для текущего задания определяется на фазе конфигурирования.
  • 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 являются аддативными. Каждый предыдущий вызов исполняемого кода сохраняется, и каждый новый фрагмент исполняемого кода добавляется в начало списка для выполнения.
  • 12. doFirst(closure) task testTask <<{ println 'Execute testTask' } >>gradle testTask testTask.doFirst{ :testTask println 'doFirst definition 1' doFirst definition 2 } doFirst definition 1 Execute testTask testTask.doFirst{ println 'doFirst definition 2' }
  • 13. doLast(closure) Добавляет блок выполняемого кода, который будем вызван после выполнения текущего задания. task testTask << { println 'Task action' >>gradle testTask } :testTask testTask.doLast{ Task action println 'Task after' Task after }
  • 14. doLast(closure) Примечание: повторные вызовы метода doLast являются аддативными. Каждый предыдущий вызов исполняемого кода сохраняется, и каждый новый фрагмент исполняемого кода добавляется в конец списка для выполнения.
  • 15. doLast(closure) task testTask <<{ println 'Execute testTask' } >>gradle testTask :testTask testTask.doLast{ Execute testTask println 'doLast definition 1' doLast definition 1 } doLast definition 2 testTask.doLast{ println 'doLast definition 2' }
  • 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') } } }
  • 37. Gradle & Ant:импорт файла сборки Импорт файла сборки Ant: ant.importBuild 'build.xml'
  • 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>
  • 41. Gradle & Ant: classpath Gradle classpath: ant.importBuild 'build.xml' defaultTasks = ['gradleBuild'] repositories { flatDir name: 'localRepository1', dirs: ant.references['antPathToLibs1'] flatDir name: 'localRepository2', dirs: ant.references.antPathToLibs2 flatDir name: 'localRepository3', dirs: "antlibs" }
  • 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.
  • 52. Gradle & Maven: репозитории Репозиторий можнот подключить по URL. repositories { mavenRepo(urls: 'http://repo.gradle.org/gradle/libs-releases-local') }
  • 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'
  • 55. Gradle & Maven: задание по-умолчанию Maven <build> <defaultGoal>clean install</defaultGoal> </build> Gradle apply plugin: 'java' defaultTasks = ['clean', 'install'] или defaultTasks 'clean', 'install'
  • 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/") } }