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

时间:2017-03-09 15:11:28

标签: java gradle groovy gradle-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方法来完成任务。但我发现没有办法让它适应我想用上面的例子做的事情。

我试图谷歌寻求解决方案,但直到现在我没有找到一个有用的提示,因为我发现的一切都是在build.gradle中直接使用groovy或类似于我的剪辑。

提前致谢!

看起来我找到了一个解决方案,至少对于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。现在我们想将一些更常见的构建配置内容移动到插件中 - 例如上面的一些基本任务。

1 个答案:

答案 0 :(得分:1)

要获取源设置,您可以询问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如何创建sourceSet中写的Java

创建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