在基于 java 的插件中创建 gradle 任务

create gradle task in java based plugin

我有一个基于 java 的 gradle 插件,它为我们的 gradle 项目做了一些常见的配置。现在我想添加任务,例如(目前存在于我们每个项目的 build.gradle 中)

task javadocJar(type: Jar) {
    classifier = "javadoc"
    from javadoc
}

我需要的是关于如何在基于 java 的 gradle 插件中执行此操作的提示。

在另一个插件中,我已经使用 project.getTasks().create("myTask", MyTask.class); 注册了任务,其中 MyTask 扩展了 AbstractTask 并且有一个 @TaskAction 方法来完成它的任务。但是我发现没有办法使它适应我想用上面的示例做的事情。

我试图 google 寻求解决方案,但直到现在我都没有找到有用的解决方案,因为我发现的所有内容都使用 groovy 或类似于我在 [=50 上面直接剪下的东西=].

提前致谢!


看起来我找到了解决方案,至少对于 javadoc 任务...

Task javadocTask = project.getTasks().getByName("javadoc");
project.getTasks().create("javadocJar", Jar.class, task -> {
    task.dependsOn(javadocTask);
    task.setClassifier("javadoc");
    task.from(javadocTask);
});

这似乎可行...但现在我对下一个 gradle 任务有疑问:

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

直到现在我还没有找到在 Java.

中使用 sourceSets varialbe 的方法

提前致谢! :)


回复 asettoufs 评论:

您链接的文档与包含子项目的项目相关。我拥有的是多个不相关的单一项目。对于那些,我们有一个插件,它已经应用了一些插件并对其进行了配置。因此,只需应用我们的插件,项目就有了共同的配置。

我们的插件是用java写的。并且应该继续java。现在我们想将一些更常见的构建配置内容移动到插件中 - 例如上面的一些基本任务。

要获取源集,您可以询问 convention

project.getTasks().create("sourceJar", Jar.class, task -> {
    task.setClassifier("sources");
    // grab the convention that holds the sourceSets
    JavaPluginConvention javaConvention = project.getConvention().getPlugin(JavaPluginConvention.class);
    // find our source set
    SourceSet mainSourceSet = javaConvention.sourceSets.findByName('main');
    // user `from` like normal
    task.from(mainSourceSet.getAllSource());
});

查看JavaPlugin如何创建在Java

中编写的sourceSet的一些源代码

正在创建 java convention https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/java/org/gradle/api/plugins/JavaPlugin.java#L266

正在创建 sourceSets https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/java/org/gradle/api/plugins/JavaPlugin.java#L298