Java 在Gradle中的自定义任务中运行任务

Java 在Gradle中的自定义任务中运行任务,java,gradle,gradle-plugin,Java,Gradle,Gradle Plugin,我正在尝试使用Java编写一个定制的Gradle插件。在这个插件中,我需要做的一件事是将所有定义的依赖项复制到一个文件夹中。我已经了解了如何使用build.gradle文件中的任务执行此操作: task copyDeps(type: Copy) { from configurations.runtime into 'build/lib' } 但是,我正在努力弄清楚如何在自己的自定义任务中运行此任务。我试过这样做: public class MyTask extends Defa

我正在尝试使用Java编写一个定制的Gradle插件。在这个插件中,我需要做的一件事是将所有定义的依赖项复制到一个文件夹中。我已经了解了如何使用build.gradle文件中的任务执行此操作:

task copyDeps(type: Copy) {
    from configurations.runtime
    into 'build/lib'
}
但是,我正在努力弄清楚如何在自己的自定义任务中运行此任务。我试过这样做:

public class MyTask extends DefaultTask {

    @TaskAction
    public void executeTask() {
        Copy copyTask = new Copy();
        copyTask.into(libFolder).from(getProject().getConfigurations().getByName("runtime").execute();
    }
}
但是,当我运行此命令时,会出现异常:

Task of type 'org.gradle.api.tasks.Copy' has been instantiated directly which is not supported. Tasks can only be created using the DSL.

我明白它想说什么,但我还没有发现我能够在Java中使用DSL执行此任务。

您不能在Gradle中的任务中创建任务。如果您想编写一个自定义插件,其中包含您所描述的任务,那么方法是编写一个自定义插件类,并在该插件类中声明一个类型为
Copy
的任务,该任务完成您想要执行的任务。这可能是这样的:

class MyCustomPlugin extends Plugin<Project> {

    void apply(Project project) {
        project.tasks.create("copyDeps", Copy.class) {
            from configurations.runtime
            into 'build/lib'
        }
    }

}
public class MyTask extends DefaultTask {

    @TaskAction
    public void executeTask() {
        project.copy(new Action<CopySpec>() {
            @Override
            void execute(CopySpec copySpec) {
                copySpec.into(libFolder);
                copySpec.from(getProject().getConfigurations().getByName("runtime"));
            }
        });

    }
}
在您的生成中自动有一个名为“copyDeps”的任务,类型为
Copy

还有一件事: 有时,在自定义任务中执行简单的复制操作会很方便。这可以使用
project.copy
util方法完成。像这样的任务看起来是这样的

public class MyTask extends DefaultTask {

    @TaskAction
    public void executeTask() {
        project.copy {
            into(libFolder)
            from(project.configurations.runtime)
        }
    }
}
使用纯java时,它将如下所示:

class MyCustomPlugin extends Plugin<Project> {

    void apply(Project project) {
        project.tasks.create("copyDeps", Copy.class) {
            from configurations.runtime
            into 'build/lib'
        }
    }

}
public class MyTask extends DefaultTask {

    @TaskAction
    public void executeTask() {
        project.copy(new Action<CopySpec>() {
            @Override
            void execute(CopySpec copySpec) {
                copySpec.into(libFolder);
                copySpec.from(getProject().getConfigurations().getByName("runtime"));
            }
        });

    }
}
公共类MyTask扩展了DefaultTask{
@任务行动
public void executeTask(){
project.copy(新操作(){
@凌驾
无效执行(CopySpec CopySpec){
copySpec.into(libFolder);
copySpec.from(getProject().getConfigurations().getByName(“运行时”));
}
});
}
}
最后一件事:
您不应该调用自己的
Task#execute()
。此方法被认为是Gradle中的内部API,执行它会直接导致意外行为。(例如,它打破了Gradles的增量构建功能)

太好了,谢谢您提供的信息。我希望复制作为我任务的一部分,因此我认为使用project.copy方法是有意义的。你知道我将如何用Java写这篇文章吗?我想不出来。也许是时候学习一些Groovy了,因为弄清楚如何用Java编写这些插件并不容易。我已经用一个简单的Java代码片段更新了我的答案,以便在任务中进行复制