使用Java创建Gradle自定义插件

Joe*_*dez 33 java gradle

我正在使用Gradle创建一个构建过程,我想提供一个使用Java代码的插件.Gradle 插件文档 这是可能的:

您可以使用您喜欢的任何语言实现自定义插件,前提是实现最终编译为字节码.对于这里的示例,我们将使用Groovy作为实现语言.如果需要,您可以使用Java或Scala.

但是,经过多个小时的谷歌搜索和阅读,我还没有找到任何解释如何使用Java创建Gradle自定义插件.看起来你可以在以下目录中为它创建代码:

<rootProjectDir>/buildSrc/src/main/java/
  MyGradlePlugin.java
  MyGradleTasks.java 
Run Code Online (Sandbox Code Playgroud)

但问题就变成了:

  1. 如何在Java中实现插件类和任务以与Gradle兼容?
  2. 如何让Gradle识别Java类和任务,以便在构建中使用它们?

    你可以像引用Groovy一样引用插件类吗?

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

我意识到我可以用project.javaexec或调用Java代码JavaExec,但我担心这会使我的构建过程不那么便携.

Joe*_*dez 67

这是一个基本的,独立的,基于Java的Gradle插件以及使其工作的步骤:

  1. 确保已安装Gradle 1.6或更高版本以及Java JDK
  2. 使用指示的目录结构在下面创建这些文件
  3. <projectRoot>/plugin目录更改为目录
  4. 执行插件构建:$ gradle uploadArchives这个(非常重要的)步骤编译Java代码并将其放入您当地的Maven仓库(../repo).
  5. 现在通过将目录更改为来执行使用者脚本 <projectRoot>/consumer
  6. 执行依赖于插件的脚本: $ 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

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");
    }

}
Run Code Online (Sandbox Code Playgroud)

插件类声明

projectRoot /插件/ src目录/主/资源/ META-INF/gradle这个-插件/ test-plugin.properties

implementation-class=org.joefernandez.gradle.MyJavaPlugin
Run Code Online (Sandbox Code Playgroud)

插件构建脚本

请注意uploadArchives任务:您必须运行此任务才能使插件可供使用者脚本使用.

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'))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

插件的设置

projectRoot /插件/ settings.gradle

rootProject.name = 'MyJavaPlugin'
Run Code Online (Sandbox Code Playgroud)

根脚本

projectRoot /的build.gradle

apply plugin: 'java'

dependencies {
    compile gradleApi()
}
Run Code Online (Sandbox Code Playgroud)

消费者脚本

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!")
}
Run Code Online (Sandbox Code Playgroud)

  • 我在https://github.com/AttwellBrian/SamplePlugin/tree/master上创建了一个基于Joe的描述的Android Studio项目.随意分叉或复制意大利面. (2认同)

Cor*_*ott 23

我想对乔的伟大答案提出一些修正.

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

消费者脚本

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
Run Code Online (Sandbox Code Playgroud)

他们将步骤6更改为:

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