【问题标题】:How to run a gradle task from a java code?如何从 Java 代码运行 gradle 任务?
【发布时间】:2018-09-27 07:22:52
【问题描述】:

我需要通过 java 方法将 gradle eclipse 任务运行到外部 gradle 项目,是否可以使用 Gradle Tooling API 来完成?

【问题讨论】:

  • 我不确定你想通过这样做实现什么。你能举个例子吗?
  • 事实上,我从我的 Gradle 项目中操作其他 gradle 项目;我希望能够在那些 Gradle 项目上运行 eclipse 任务(gradle eclipse 插件),以便可以从 eclipse 打开这些项目,希望你能理解我的问题。
  • @UnlikePluto 但没有建议的解决方案。

标签: java gradle gradle-eclipse


【解决方案1】:

Gradle forum 提供了一个以编程方式执行此操作的好示例,但由于它忽略了项目的单个 gradle 包装器,它不能保证构建的顺利执行,甚至会破坏您的应用程序。有关为什么您总是应该依赖 gradle 包装器的更多信息,请阅读 here 和 here。

使用 Gradle 包装器

推荐的方法是运行exec 并调用项目包装器,同时将任务作为参数传递。此示例调用当前项目包装器并将jar 作为参数传递:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Main
{
    private static String PATH_TO_GRADLE_PROJECT = "./";
    private static String GRADLEW_EXECUTABLE = "gradlew.bat";
    private static String BLANK = " ";
    private static String GRADLE_TASK = "jar";

    public static void main(String[] args)
    {
        String command = PATH_TO_GRADLE_PROJECT + GRADLEW_EXECUTABLE + BLANK + GRADLE_TASK;
        try
        {
            Runtime.getRuntime().exec(command);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

使用 Gradle 工具 API

要在外部项目中使用 Gradle 工具 API,您只需定义 GradleConnectorobject 的属性 forProjectDirectory。在BuildLauncher 对象上运行任务调用run()。下面的例子演示了基本原理:

import org.gradle.tooling.BuildLauncher;
import org.gradle.tooling.GradleConnector;
import org.gradle.tooling.ProjectConnection;

import java.io.File;

public class ToolingAPI
{
    private static final String GRADLE_INSTALLATION = "C:\\Program Files\\Gradle";
    private static final String GRADLE_PROJECT_DIRECTORY = "path_to_root_of_a_gradle_project";
    private static final String GRADLE_TASK = "help";

    private GradleConnector connector;

    public ToolingAPI(String gradleInstallationDir, String projectDir)
    {
        connector = GradleConnector.newConnector();
        connector.useInstallation(new File(gradleInstallationDir));
        connector.forProjectDirectory(new File(projectDir));
    }

    public void executeTask(String... tasks)
    {
        ProjectConnection connection = connector.connect();
        BuildLauncher build = connection.newBuild();
        build.forTasks(tasks);

        build.run();
        connection.close();
    }

    public static void main(String[] args)
    {
        ToolingAPI toolingAPI = new ToolingAPI(GRADLE_INSTALLATION, GRADLE_PROJECT_DIRECTORY);
        toolingAPI.executeTask(GRADLE_TASK);
    }
}

这种方法的缺点是执行任务时 gradle 不感知位置。如果您在 new File("somefile") 等自定义任务中调用任何文件创建或修改方法,则会引发异常。

【讨论】:

  • "这种方法的缺点是执行任务时 gradle 的位置不感知。"为什么会这样?
猜你喜欢
  • 2020-06-21
  • 2019-10-24
  • 2020-10-31
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2020-07-09
  • 2023-03-31
相关资源
最近更新 更多