自定义Gradle插件在Multiproject构建中仅执行一次

时间:2019-02-06 14:56:37

标签: java gradle build.gradle gradle-plugin

我已经用Java编写了gradle插件,我想在多项目gradle设置中使用它。插件随附的任务仅执行一次,我不明白为什么。

项目的结构如下:

Root project
     |- settings.gradle
     |- build.gradle
     |- project1
     |     |- build.gradle
     |- project2
     |     |- build.gradle
     |- project3
     |     |- build.gradle
     ...

root build.gradle看起来像这样

buildscript {
repositories {
    jcenter()
    maven { url "https://repo.spring.io/plugins-snapshot" }
    maven { url "https://repo.spring.io/plugins-release" }

    maven{
        url = "https://my-personal-nexus.de/content/repositories/release/"
    }
    ....
    dependencies {
       ....
       classpath "de.mystuff:myCustomPlugin:1.0.0"
    }
  }
}
subprojects {
   apply plugin: "myCustomPlugin"
   ....
}

插件“ myCustomPlugin”提供了一个名为myTask的任务。由于该插件应用在build.gradle的子项目中,因此我假设在调用时:

./gradlew myTask

将为project1,project2,project3执行任务。

实际上,任务仅在project1中执行,而不在project2或project3中执行。如果我打电话

./gradlew -p "project2" myTask

在项目2中执行任务就好了。 关于为什么没有为每个子项目执行任务的任何提示?

当我打电话

 ./gradlew tasks --all

结果显示每个子项目的任务。

谢谢!

编辑:

任务的插件代码:

public class MyGeneratorTask extends DefaultTask {

@TaskAction
public void genMyCode() throws Exception {
        MyGeneratorExtension extension = getProject().getExtensions().getByType(MyGeneratorExtension.class);
        MyGeneratorConfig.setPath(extension.getPath());
        MyGeneratorConfig.setGendir(extension.getGendir());
        MyCodeGeneratorApplication.generateMyClasses();
    }
}

插件定义本身:

public class MyPlugin implements Plugin<Project> {
    static final String GEN_TASK_CONFIG = "myConfig";
    static final String GEN_TASK_NAME = "myTask";

    @Override
    public void apply(Project target) {
        target.getExtensions().add(GEN_TASK_CONFIG, MyGeneratorExtension.class);
        target.getTasks().create(GEN_TASK_NAME, MyGeneratorTask.class);
    }
}

扩展名的代码:

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = false)
public class MyGeneratorExtension {

   private String path;
   private String gendir;

}

1 个答案:

答案 0 :(得分:0)

解决方案:

当您在Task中调用静态方法时,gradle似乎不喜欢它。 切换到类初始化后,它就起作用了。

感谢@ M.Ricciuti