Мне нужно запустить задачу Gradle Eclipse для внешнего проекта Gradle из java-метода, возможно ли это сделать с помощью API-интерфейса Gradle Tooling?
Возможный дубликат Вызов задачи gradle из класса java
Фактически, из моего проекта Gradle я управляю другими проектами Gradle; и я хочу иметь возможность запускать задачу eclipse (плагин gradle eclipse) в этих проектах Gradle, чтобы эти проекты можно было открывать из eclipse, надеюсь, вы понимаете мою проблему.
@UnlikePluto, но предлагаемого решения нет.




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 BALNK = " ";
private static String GRADLE_TASK = "jar";
public static void main(String[] args)
{
String command = PATH_TO_GRADLE_PROJECT + GRADLEW_EXECUTABLE + BALNK + GRADLE_TASK;
try
{
Runtime.getRuntime().exec(command);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Использование API-интерфейса Gradle Tooling
Чтобы использовать API инструментов Gradle во внешнем проекте, вам просто нужно определить свойство forProjectDirectory вашего объекта GradleConnector. Чтобы запустить задачу, вызовите 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"), возникнет исключение.
«Обратной стороной этого подхода является незнание местоположения gradle при выполнении задачи». почему так?
Я не уверен, чего вы хотите этим добиться. Вы можете привести для этого пример?