我需要从java方法将gradle eclipse任务运行到外部gradle项目,是否可以使用Gradle工具API来完成?
Gradle 论坛提供了一个以编程方式执行此操作的很好的例子,但由于它忽略了项目的各个 gradle 包装器,因此它无法保证构建的顺利执行,甚至破坏您的应用程序。有关为什么您应该始终依赖 gradle 包装器的更多信息,请阅读 这里 和 这里.
使用 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 工具接口
要在外部项目中使用 Gradle 工具 api,您只需定义GradleConnector
对象的属性forProjectDirectory
即可。运行任务调用run()
对BuildLauncher
对象。下面的示例演示了基本原理:
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")
将引发异常。