如何使用Gradle的Java API定义过滤的FileTree?

时间:2013-07-25 01:40:47

标签: java gradle

我正在使用Java构建Gradle插件,因为我想利用一些Java库。作为插件的一部分,我需要列出和处理文件的文件夹。我可以在gradle构建文件中找到许多如何执行此操作的示例:

  FileTree tree = fileTree(dir: stagingDirName)
  tree.include '**/*.md'
  tree.each {File file ->
    compileThis(file)
  }

但是如何使用Gradle的Java api在Java中执行此操作?

底层的FileTree Java类具有非常灵活的输入参数,这使得它非常强大,但是很难确定哪种输入实际上会起作用。

2 个答案:

答案 0 :(得分:0)

它实际上是相同的,例如project.fileTree(someMap)。甚至只有基本目录(而不是地图)的fileTree方法的重载。您可以使用for-each循环而不是闭包来代替each,而不是闭包,您通常可以使用实现Action接口的匿名内部类(尽管fileTree似乎缺少这些方法重载)。 Gradle Build Language Reference有详细信息。 PS:您还可以利用Groovy的Java库。

答案 1 :(得分:0)

以下是我在基于java的gradle任务中执行此操作的方法:

public class MyPluginTask extends DefaultTask {

    @TaskAction
    public void action() throws Exception {

        // sourceDir can be a string or a File
        File sourceDir = new File(getProject().getProjectDir(), "src/main/html");
        // or:
        //String sourceDir = "src/main/html";

        ConfigurableFileTree cft = getProject().fileTree(sourceDir);
        cft.include("**/*.html");

        // Make sure we have some input. If not, throw an exception.
        if (cft.isEmpty()) {
            // Nothing to process. Input settings are probably bad. Warn user.
            throw new Exception("Error: No processable files found in sourceDir: " +
                    sourceDir.getPath() );
        }

        Iterator<File> it = cft.iterator();
        while (it.hasNext()){
            File f = it.next();
            System.out.println("File: "+f.getPath()"
        }
    }

}