2

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

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

但是我将如何使用 Gradle 的 Java api 在 Java 中做到这一点?

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

4

2 回答 2

1

以下是我在基于 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()"
        }
    }

}
于 2013-08-26T19:02:13.723 回答
0

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

于 2013-07-25T02:02:31.527 回答