Как запустить задачу Gradle из Java-кода?

Мне нужно запустить задачу Gradle Eclipse для внешнего проекта Gradle из java-метода, возможно ли это сделать с помощью API-интерфейса Gradle Tooling?

Я не уверен, чего вы хотите этим добиться. Вы можете привести для этого пример?

nimi0112 17.04.2018 12:56

Возможный дубликат Вызов задачи gradle из класса java

UnlikePluto 17.04.2018 13:06

Фактически, из моего проекта Gradle я управляю другими проектами Gradle; и я хочу иметь возможность запускать задачу eclipse (плагин gradle eclipse) в этих проектах Gradle, чтобы эти проекты можно было открывать из eclipse, надеюсь, вы понимаете мою проблему.

khouloud 17.04.2018 13:07

@UnlikePluto, но предлагаемого решения нет.

khouloud 17.04.2018 13:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
5 641
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 при выполнении задачи». почему так?

pavi2410 07.03.2021 18:14

Другие вопросы по теме