Gradle для выполнения Java-класса (без изменения build.gradle)

Существует простой плагин Eclipse для запуска Gradle, который просто использует способ командной строки для запуска gradle.

Что такое gradle аналог для компиляции и запуска maven mvn compile exec:java -Dexec.mainClass=example.Example

Таким образом может быть запущен любой проект с gradle.build.

UPDATE: был аналогичный вопрос Что такое gradle эквивалент плагина exec maven для запуска Java-приложений? спросил раньше, но решение предложило изменить каждый проект build.gradle

package runclass;

public class RunClass {
    public static void main(String[] args) {
        System.out.println("app is running!");
    }
}

Затем выполнение gradle run -DmainClass=runclass.RunClass

:run FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> No main class specified   

Ответ 1

В Gradle нет прямого эквивалента mvn exec:java, вам нужно либо применить плагин application, либо выполнить задание JavaExec.

application плагин

Активируйте плагин:

plugins {
    id 'application'
    ...
}

Настройте его следующим образом:

application {
    mainClassName = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
}

В командной строке напишите

$ gradle -PmainClass=Boo run

JavaExec задача

Определите задачу, скажем, execute:

task execute(type:JavaExec) {
   main = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
   classpath = sourceSets.main.runtimeClasspath
}

Чтобы запустить, напишите gradle -PmainClass=Boo execute. Вы получаете

$ gradle -PmainClass=Boo execute
:compileJava
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes
:execute
I am BOO!

mainClass - это свойство, передаваемое динамически в командной строке. classpath настроен на получение последних классов.


Если вы не передадите свойство mainClass, оба подхода завершатся неудачно, как и ожидалось.

$ gradle execute

FAILURE: Build failed with an exception.

* Where:
Build file 'xxxx/build.gradle' line: 4

* What went wrong:
A problem occurred evaluating root project 'Foo'.
> Could not find property 'mainClass' on task ':execute'.

Ответ 2

Вам просто нужно использовать Gradle Плагин приложений:

apply plugin:'application'
mainClassName = "org.gradle.sample.Main"

А затем просто gradle run.

Как указывает Тереза, вы также можете настроить mainClassName как системное свойство и запустить с аргументом командной строки.

Ответ 3

Развернув ответ "Первый нуль", я думаю, вам нужно что-то, где вы также можете запустить gradle build без ошибок.

Оба gradle build и gradle -PmainClass=foo runApp работают с этим:

task runApp(type:JavaExec) {
    classpath = sourceSets.main.runtimeClasspath

    main = project.hasProperty("mainClass") ? project.getProperty("mainClass") : "package.MyDefaultMain"
}

где вы устанавливаете основной класс по умолчанию.