Подтвердить что ты не робот

Создание пользовательского плагина Gradle с Java

Я создаю процесс сборки с Gradle, и я хочу предоставить плагин, который использует код Java. Документация плагина Gradle говорит, что это возможно:

Вы можете реализовать собственный плагин на любом языке, который вам нравится, если реализация завершится компиляцией в виде байт-кода. Для примеров здесь мы будем использовать Groovy как язык реализации. Вместо этого вы можете использовать Java или Scala.

Однако после нескольких часов Googling и чтения я еще не нашел объяснений, как создать пользовательский плагин Gradle с Java. Кажется, вы могли бы создать код для него в каталоге, например:

<rootProjectDir>/buildSrc/src/main/java/
  MyGradlePlugin.java
  MyGradleTasks.java 

Но тогда возникает вопрос:

  • Как реализовать класс и задачи плагина в Java для совместимости с Gradle?
  • Как получить Gradle для распознавания классов и задач Java, чтобы вы могли использовать их в сборке?

    Вы можете просто ссылаться на класс плагина, как вы это делаете для эквивалента Groovy?

    src/main/resources/META-INF/gradle-plugins/myjavaplugin.properties implementation-class=org.me.MyGradlePlugin

Я понимаю, что я мог просто вызвать код Java с помощью project.javaexec или JavaExec, но я обеспокоен тем, что это сделает мой процесс сборки менее переносимым.

4b9b3361

Ответ 1

Вот базовый автономный Java-модуль Gradle и шаги для его работы:

  • Убедитесь, что Gradle 1,6 или более поздней версии и установлен Java JDK
  • Создайте эти файлы ниже с указанной структурой каталогов
  • Измените каталоги на каталог <projectRoot>/plugin
  • Выполнение сборки плагина: $ gradle uploadArchives Этот (очень важный) шаг компилирует код Java и помещает его в локальный репозиторий Maven (../repo).
  • Теперь выполните пользователя script, изменив каталоги на <projectRoot>/consumer
  • Выполните script, который зависит от плагина: $ gradle checkitout

Классы Java

projectRoot/плагин/SRC/Основной/Java/орг/joefernandez/ gradle/MyJavaPlugin.java

package org.joefernandez.gradle;

import org.gradle.api.Project;
import org.gradle.api.Plugin;

public class MyJavaPlugin implements Plugin<Project> {

    @Override
    public void apply(Project target) {
        target.task("javaTask");
    }

}

projectRoot/плагин/SRC/Основной/Java/орг/joefernandez/ gradle/MyJavaTask.java

package org.joefernandez.gradle;

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;

public class MyJavaTask extends DefaultTask {

    @TaskAction
    public void javaTask() {
        System.out.println("Hello from MyJavaTask");
    }

}

Объявление класса плагинов

projectRoot/плагин/SRC/основная/ресурсы/META-INF/ gradle -plugins/test-plugin.properties

implementation-class=org.joefernandez.gradle.MyJavaPlugin

Плагин Build Script

Обратите внимание на задачу uploadArchives: вы должны запустить эту задачу, чтобы сделать плагин доступным для пользователя script.

projectRoot/плагин/build.gradle

apply plugin: 'java'

dependencies {
    compile gradleApi()
}

apply plugin: 'maven'

repositories {
    mavenCentral()
}

dependencies {
    testCompile 'junit:junit:4.11'
}

group = 'org.joefernandez'
version = '1.0-SNAPSHOT'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

Настройки для плагина

projectRoot/плагин/settings.gradle

rootProject.name = 'MyJavaPlugin'

Корень Script

projectRoot/build.gradle

apply plugin: 'java'

dependencies {
    compile gradleApi()
}

Потребитель Script

projectRoot/потребитель/build.gradle

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'org.joefernandez',
                   name: 'MyJavaPlugin',
                version: '1.0-SNAPSHOT'
    }
}
apply plugin: 'test-plugin'

task checkitout(type: org.joefernandez.gradle.MyJavaTask) {
    println("running consumer task!")
}

Ответ 2

Я хотел бы предложить несколько поправок к Джо большому ответу.

projectRoot/плагин/SRC/Основной/Java/орг/joefernandez/ gradle/MyJavaPlugin.java

Это изменение направляет задачу в поставляемый проект без необходимости подкласса.

package org.joefernandez.gradle;

import org.gradle.api.Project;
import org.gradle.api.Plugin;

public class MyJavaPlugin implements Plugin<Project> {

    @Override
    public void apply(Project target) {
        // CHANGE HERE
        target.getTasks().create("javaTask", MyJavaTask.class);
    }

}

Потребитель script

projectRoot/потребитель/build.gradle

Это изменение устраняет ненужное определение задачи

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'org.joefernandez',
                   name: 'MyJavaPlugin',
                version: '1.0-SNAPSHOT'
    }
}
apply plugin: 'test-plugin'

// CHANGE HERE

Это изменяет шаг 6, чтобы:

Execute the script that depends on the plugin: $ gradle javaTask

Ответ 3

Классы плагинов должны реализовывать интерфейс org.gradle.api.Plugin. Классы задач обычно расширяют класс org.gradle.api.DefaultTask. Не имеет значения, какой язык (JVM) используется для этого. Кодовая база Gradle содержит много классов плагинов и задач, реализованных в Java.

Как создать и отправить плагин - это еще один вопрос, опять же в основном не связанный с тем, какой язык используется. См. Gradle Руководство пользователя и samples/customPlugin в полном дистрибутиве Gradle.