如何从Java代码中运行Gradle任务?

9

我需要从Java方法中运行Gradle工具,以对外部Gradle项目执行Eclipse任务。使用Gradle Tooling API是否可以实现?


1
我不确定你想通过这样做来实现什么。你能举个例子吗? - nimi0112
1
可能是从Java类调用Gradle任务的重复问题。 - UnlikePluto
事实上,我从我的Gradle项目中操作其他Gradle项目;我希望能够在这些Gradle项目上运行eclipse任务(即Gradle Eclipse插件),以便可以从eclipse中打开这些项目。希望您能理解我的问题。 - khouloud
@UnlikePluto 但是没有建议的解决方案。 - khouloud
1个回答

16
Gradle论坛提供了一个不错的程序化示例,但由于它忽略了项目的独立Gradle Wrapper,因此无法保证您的构建顺利执行,甚至可能会破坏您的应用程序。有关为什么您始终应该依赖Gradle Wrapper的更多信息,请阅读这里这里使用Gradle Wrapper 推荐的方法是运行exec并调用项目的Wrapper,同时将任务作为参数传递。此示例调用当前项目的Wrapper,并将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 Tooling API

要在外部项目中使用Gradle tooling api,您只需要定义GradleConnector对象的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在执行任务时无法感知位置。为什么会这样呢? - pavi2410

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接