Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gradle工具API-查找GradleProject的所有任务_Java_Intellij Idea_Gradle_Gradle Tooling Api - Fatal编程技术网

Java Gradle工具API-查找GradleProject的所有任务

Java Gradle工具API-查找GradleProject的所有任务,java,intellij-idea,gradle,gradle-tooling-api,Java,Intellij Idea,Gradle,Gradle Tooling Api,我完全被困在这里了。我正在编写一个java类,用来操作gradle构建 我已经成功地实例化了gradle工具API(连接器,GradleProject),但这两个工具都不能让我得到BuildLauncher可用的所有任务的简单列表(提示:一些任务可能在插件中)。然而,我成功地运行了“:tasks”任务,然后解析了它的输出,但听起来很糟糕 其中一个想法是以某种方式获得org.gradle.api.Project参考,但我也做不到 我是否遗漏了一些重要的东西,或者仅仅是工具API从来没有提供对gra

我完全被困在这里了。我正在编写一个java类,用来操作gradle构建

我已经成功地实例化了gradle工具API(连接器,GradleProject),但这两个工具都不能让我得到BuildLauncher可用的所有任务的简单列表(提示:一些任务可能在插件中)。然而,我成功地运行了“:tasks”任务,然后解析了它的输出,但听起来很糟糕

其中一个想法是以某种方式获得org.gradle.api.Project参考,但我也做不到


我是否遗漏了一些重要的东西,或者仅仅是工具API从来没有提供对gradle API的访问?

下面的代码似乎可以帮助您:

GradleConnector connector = GradleConnector.newConnector();
connector.forProjectDirectory(new File(".")); // project dir

ProjectConnection connection = connector.connect();
try {
   // Load the model for the project
   GradleProject project = connection.getModel(GradleProject.class);
   System.out.println("Project: " + project.getName());
   System.out.println("Tasks:");
   for (Task task : project.getTasks()) {
       System.out.println("    " + task.getName());
    }
 } finally {
    // Clean up
    connection.close();
 }

基本上你需要得到模型。还请查看$GRADLE_HOME/sample/toolingApi下的示例。

我不想回答我自己的问题,我已经提到我对这个解决方案不满意,但这里是为了防止有人需要它。我不会接受的

它包括运行“:tasks”任务,将所有可用任务打印到其标准输出。不幸的是,并非所有的stdout行都包含任务名称,但我不必处理这个问题

    OutputStream outputStream = new OutputStream() {
        private StringBuilder string = new StringBuilder();
        @Override
        public void write(int b) throws IOException {
            this.string.append((char) b);
        }
        public String toString() {
            return this.string.toString();
        }
    };

    ProjectConnection connection = GradleConnector.newConnector()
            .forProjectDirectory(getProjectDirectoryFile())
            .connect();

    BuildLauncher buildLauncher = connection.newBuild();
    buildLauncher.forTasks(":tasks");

    buildLauncher.setStandardOutput(outputStream);
    buildLauncher.run();

    for (String line : outputStream.toString().split("\\r?\\n")) {
        if(containsTaskName(line)) {
            String taskName = line.split(" ")[0];
            System.out.println(taskName);
        }
    }

如果运行
gradle:tasks
,它将列出所有项目的任务

如果执行以下操作,它将仅列出根项目的任务:

GradleProject项目=connection.getModel(GradleProject.class);
for(任务:project.getTasks()){
System.out.println(“+task.getName());
}
这也许可以解释为什么你只看到10个任务,而你预期有20多个任务

要列出所有任务,您需要遍历所有项目

由于项目层次结构是一棵树,您可能需要使用递归遍历树结构


您可以使用
project.getChildren()
列出子项目节点并遍历/遍历树。在每个项目节点,您都可以使用
project.getTasks()
获取任务。

谢谢@Opal。事实上,这和我自己找到的代码差不多,我也在抱怨。我希望它的输出等同于“:tasks”任务(标题为:所有可从根项目运行的任务)的输出。我有或多或少的“Hello world”Android Studio gradle项目,其中包括以下部分:Android任务、构建任务、构建设置任务。。。总共有20个左右的任务,但是运行这段代码只给了我10个任务。你能提供一个重现这个问题的例子吗?我想我不能提供所有相关的。这是默认新建项目加上在Android Studio AI-141.2006197中选择单个活动的结果。我知道它指的是android gradle插件,但是使用project.getTasks()找不到android任务(来自插件)。