Глава 56. Плагин Groovy.

Плагин Groovy расширяет плагин Java, добавляя поддержку проектов Groovy. Он может работать с кодом Groovy, смешанным Groovy и Java кодом и даже с чистым Java кодом (хотя его и необязательно использовать для последнего). Плагин поддерживает комбинированную компиляцию, которая позволяет вам свободно смешивать и сопостовлять код Groovy и Java, с зависимостями в обоих направлениях. Например, класс Groovy может наследоваться от класса Java, который в свою очередь наследуется от класса Groovy. Это позволяет использовать наилучший язык для работы и, в случае необходимости, переписать любой класс на другой язык.

56.1. Использование.

Чтобы использовать плагин Groovy, включите следующее в ваш сборочный файл:

Пример 56.1. Использование плагина Groovy

build.gradle

apply plugin: 'groovy'
	  

56.2. Задачи.

Плагин Groovy добавляет следующие задачи к проекту.

Таблица 56.1. Плагин Groovy - задачи
Имя задачиЗависит отТипОписание
compileGroovycompileJavaGroovyCompileКомпилирует исходные файлы Groovy.
compileTestGroovycompileTestJavaGroovyCompileКомпилирует исходные файлы тестов Groovy.
compileНаборИсходниковGroovycompileНаборИсходниковJavaGroovyCompileКомпилирует исходные файлы Groovy данного набора исходников.
groovydoc-GroovydocГенерирует документацию API исходных файлов Groovy.

Плагин Groovy добавляет следующие зависимости к задачам, добавленным плагином Java.

Таблица 56.2. Плагин Groovy - дополнительные зависимости задач
Имя задачиЗависит от
classescompileGroovy
testClassescompileTestGroovy
наборИсходниковClassescompileНаборИсходниковGroovy
Рисунок 56.1. Плагин Groovy - задачи
Плагин Groovy - задачи

56.3. Разметка проекта.

Плагин Groovy предполагает, что у проекта такая разметка, как показано в Таблице 56.3 Плагин Groovy - разметка проекта. Все исходные папки Groovy могут содержать код Groovy и Java. Исходные папки Java могут содержать только исходные коды Java. Ни одна из папок не обязана существовать или что-либо содержать; плагин Groovy просто скомпилирует все, что найдет.

Таблица 56.3. Плагин Groovy - разметка проекта
ПапкаЗначение
src/main/javaИсходные коды Java.
src/main/resourcesРесурсы
src/main/groovyИсходные коды Groovy. Может также содержать исходные коды Java для совместной компиляции.
src/test/javaИсходные коды тестов Java.
src/test/resourcesРесурсы тестов.
src/test/groovyРесурсы тестов Groovy. Может также содержать исходные коды Java для совместной компиляции.
src/наборИсходников/javaИсходные коды Java данного набора исходников.
src/наборИсходников/resourcesРесурсы данного набора исходников.
src/наборИсходников/groovyИсходные коды Groovy данного набора исходников. Может также содержать исходные коды Java для совместной компиляции.

56.3.1. Изменение разметки проекта.

Так же как и плагин Java, Groovy позволяет вам настроить местоположения для исходников и тестов.

Пример 56.2. Пользовательская разметка исходных кодов Groovy

build.gradle

sourceSets {
    main {
        groovy {
            srcDirs = ['src/groovy']
        }
    }

    test {
        groovy {
            srcDirs = ['test/groovy']
        }
    }
}
	  

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

Так как язык сборки Gradle основывается на Groovy и часть Gradle реализована на этом языке, он уже поставляется с библиотекой Groovy (2.4.10 в версии Gradle 3.5). Тем не менее, проектам Groovy необходимо явно объявлять зависимость от Groovy. Потом эта зависимость будет использоваться в пути к классам компиляции и выполнения. Также она будет использоваться для получения доступа к компилятору Groovy и инструменту Groovydoc.

Если Groovy используется для "боевого" кода, зависимость должна быть добавлена в конфигурацию compile.

Пример 56.3. Настройка зависимости Groovy

build.gradle

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.10'
}
	  

Если Groovy используется для кода тестов, тогда зависимость должна быть добавлена в конфигурацию testCompile:

Пример 56.4. Настройка зависимости тестов Groovy

build.gradle

dependencies {
    testCompile 'org.codehaus.groovy:groovy-all:2.4.10'
}
	  

Чтобы использовать библиотеку Groovy, которая поставляется с Gradle, объявите зависимость localGroovy(). Обратите внимание, что различные версии Gradle поставляются с различными версиями Groovy; таким образом, использование localGroovy() менее безопасно, чем объявление обычной зависимости Groovy.

Пример 56.5. Настройка зависимости Groovy, поставляющейся с Gradle

build.gradle

dependencies {
    compile localGroovy()
}
	  

Библиотека Groovy не обязательно должна быть из удаленного хранилища. Она также может быть в локальной папке lib, возможно, находящейся под версионным контролем:

Пример 56.6. Настройка файловой зависимости Groovy

build.gradle

repositories {
    flatDir { dirs 'lib' }
}

dependencies {
    compile module('org.codehaus.groovy:groovy:2.4.10') {
        dependency('org.ow2.asm:asm-all:5.0.3')
        dependency('antlr:antlr:2.7.7')
        dependency('commons-cli:commons-cli:1.2')
        module('org.apache.ant:ant:1.9.4') {
            dependencies('org.apache.ant:ant-junit:1.9.4@jar',
                         'org.apache.ant:ant-launcher:1.9.4')
        }
    }
}
	  

Ссылка 'module' может быть новой для вас. Чтобы узнать о ней больше, а также узнать другую информацию об управлении зависимостями, смотрите Главу 25 Управление зависимостями.

56.5. Автоматическая настройка groovyClasspath.

Задачи GroovyCompile и Groovydoc получают исходные файлы Groovy двумя способами: из их пути к классам и из их groovyClasspath. Первый используется для нахождения классов, на которые ссылается исходный код и обычно будет содержать библиотеки Groovy вместе с другими библиотеками. Последний используется для загрузки и выполнения компилятора Groovy и инструмента Groovydoc и должен содержать только библиотеки Groovy и их зависимости.

Если groovyClasspath задачи не настроен, плагин Groovy попытается вывести его из пути к классам. Это делается так:

  • Если jar-файл groovy-all(-indy) найден в пути к классам, он будет добавлен в groovyClasspath.
  • Если jar-файл groovy(-indy) найден в пути к классам и у проекта есть как минимум одно объявленное хранилище, соответствующая зависимость хранилища groovy(-indy) будет добавлена в groovyClasspath.
  • В противном случае, выполнение задачи будет прервано с ошибкой, говорящей о том, что groovyClasspath не может быть выведен.

Обратите внимание, что вариант '-indy' каждого jar-файла ссылается на версию с поддержкой invokedynamic (динамического выполнения).

56.6. Условные свойства.

Плагин Groovy не одного условного свойства к проекту.

56.7. Свойства наборов исходников.

Плагин Groovy добавляет следующие условные свойства к каждому набору исходником проекта. Вы можете использовать эти свойства в вашем сборочном скрипте, как если бы они были свойствами объекта набора исходников.

Таблица 56.4. Плагин Groovy - свойства наборов исходников
Имя свойстваТипЗначение по умолчаниюОписание
groovySourceDirectorySet (только для чтения)Не nullИсходные файлы Groovy этого набора исходников. Содержит все файлы .groovy и .java, найденные в исходных папках Groovy и исключает все остальные типы файлов.
groovy.srcDirsSet<File>. Вы можете использовать все, описанное в Секции 20.5 Указание набора входных файлов.[папкаПроекта/src/имя/groovy]Исходные папки, содержащие исходные файлы Groovy этого набора исходников. Также может содержать исходные файлы Java для совместной компиляции.
allGroovyFileTree (только для чтения)Не nullВсе исходные файлы Groovy этого набора исходников. Содержит только файлы .groovy, найденные в исходных папках Groovy.

Эти свойства предоставляются условным объектом типа GroovySourceSet.

Плагин Groovy также изменяет некоторые свойства наборов исходников:

Таблица 56.5. Плагин Groovy - свойства наборов исходников
Имя свойстваИзменение
allJavaДобавляет все файлы .java, найденные в папках исходников Groovy.
allSourceДобавляет все исходные файлы, найденные в папках исходников Groovy.

56.8. GroovyCompile.

Плагин Groovy добавляет задачу GroovyCompile для каждого набора исходников в проекте. Тип задачи наследуется от задачи JavaCompile (смотрите CompileJava). Задача GroovyCompile поддерживает большинство опций конфигурации официального компилятора Groovy.

Таблица 56.6. Плагин Groovy - свойства GroovyCompile
Свойство задачиТипЗначение по умолчанию
classpathFileCollectionнаборИсходников.compileClasspath
sourceFileTree. Можно установить любым способом, описанным в Секции 20.5 Указание набора входных файлов.наборИсходников.groovy
destinationDirFileнаборИсходников.output.classesDir
groovyClasspathFileCollectionКонфигурация groovy, если не пустая; в противном случае, библиотека Groovy, найденная в пути к классам.

56.9. Компиляция и тестирование с Java 6.

Компилятор Groovy всегда будет выполняться с той же версией Java, которая использовалась для старта Gradle. Вы должны установить sourceCompatibility и targetCompatibility в 1.6. Если у вас также есть исходники Java, вы можете следовать тем же инструкциям, что описаны в главе о Java плагине, чтобы гарантировать корректную версию, используемого компилятора Java.

Пример 56.7. Настройка сборки Java 6 для Groovy

gradle.properties

# in $HOME/.gradle/gradle.properties
java6Home=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
	  

build.gradle

sourceCompatibility = 1.6
targetCompatibility = 1.6

assert hasProperty('java6Home') : "Set the property 'java6Home' in your your gradle.properties pointing to a Java 6 installation"
def javaExecutablesPath = new File(java6Home, 'bin')
def javaExecutables = [:].withDefault { execName ->
    def executable = new File(javaExecutablesPath, execName)
    assert executable.exists() : "There is no ${execName} executable in ${javaExecutablesPath}"
    executable
}
tasks.withType(AbstractCompile) {
    options.with {
        fork = true
        forkOptions.javaHome = file(java6Home)
    }
}
tasks.withType(Javadoc) {
    executable = javaExecutables.javadoc
}
tasks.withType(Test) {
    executable = javaExecutables.java
}
tasks.withType(JavaExec) {
    executable = javaExecutables.java
}