Gradle自定义插件取决于系统任务

时间:2016-04-05 16:09:06

标签: java gradle gradle-plugin

我有一个名为MyPlugin的自定义插件,它包含一个名为MyTask的自定义任务。我想MyTask依赖compileJava。我试图提供MyTask.dependsOn(compileJava),但它说Task called 'MyTask' is not existing。有没有办法做到这一点?

MyPlugin.java

public class MyPlugin implements Plugin<Project> {
    public static final String TASK_NAME = "MyTask";

    @Override
    public void apply(Project project) {
        project.getExtensions().create(TASK_NAME, MyExtension.class);
        project.getTasks().create(TASK_NAME, MyTask.class);
    }
}

MyTask.java

public class MyTask extends DefaultTask {
    private MyExtension extension;

    @TaskAction
    public void myTask() {
        Project project = getProject();
        extension = project.getExtensions().findByType(MyExtension.class);
        PropertyManager propertyManager = new PropertyManager(project, extension);
        propertyManager.setProperties();
        System.out.println(extension.getValue());
    }

MyExtension.java

public class MyExtension {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

的build.gradle

apply plugin: 'maven'
apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'com.jfrog.bintray'

sourceCompatibility = 1.8

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile gradleApi()
}

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    }
}

task copyLibs(type: Copy) {
    from configurations.runtime
    into "$projectDir/libs"
}

MyTask.dependsOn(copyLibs)  //not working
MyTask.dependsOn(compileJava)   //not working

3 个答案:

答案 0 :(得分:1)

你必须使用

tasks.MyTask.dependsOn(copyLibs) 
tasks.MyTask.dependsOn(compileJava)

因为您定义的任务对象不在当前范围内,如copyLibs。但您可以通过任务参考(参见:https://docs.gradle.org/current/dsl/org.gradle.api.Project.html

访问它

答案 1 :(得分:0)

如果您将gradle插件应用于其他gradle项目,例如projectA,则您的插件会向projectA添加一个名为MyTask的任务。您在上面发布的build.gradle是针对插件项目的,并且没有名为MyTask的任务。

答案 2 :(得分:-1)

据我所知,您的任务名为myTask,而不是MyTask 这是作者代码中的拼写错误。

<强>更新

您不应用插件,因此无法创建任务。并且您无法从插件的build.gradle应用插件。至少你不能应用正在构建的插件的版本。您可以做的最好的事情是应用以前构建的插件版本,该插件存储在Maven仓库中。但它看起来不是一个好主意。