Подтвердить что ты не робот

Как сделать задачу для вызова основного класса

Я пытаюсь сделать задачу в build.gradle, которая будет выполнять основной класс (класс с основным методом), но я не знаю, как это сделать.

Я сделал тестовый проект, чтобы проверить, как это сделать. Вот макет файловой структуры:

testProject/
    build.gradle
    src/main/groovy/hello/world/HelloWorld.groovy

Вот содержимое build.gradle:

apply plugin: 'groovy'
apply plugin: 'maven'

repositories {
    mavenCentral()
}

dependencies {
    compile     'org.codehaus.groovy:groovy-all:2.0.6'
}

task( hello, dependsOn: jar, type: JavaExec ) {
    main = 'hello.world.HelloWorld'
}

Вот содержимое HelloWorld.groovy:

package hello.world

class HelloWorld {
    public static void main(String[] args) {
        println "Hello World!"
    }
}

Вот что я получаю из оболочки:

testProject>$ gradle hello
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:hello
Error: Could not find or load main class hello.world.HelloWorld
:hello FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':hello'.
> Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 4.232 secs

Итак, мой вопрос: как я могу сделать gradle hello работу? Большое вам спасибо.

4b9b3361

Ответ 1

После небольшого поиска в Google, я нашел решение. Единственное, что мне нужно изменить, это блок задач. Рабочий наклеивается ниже:

task( hello, dependsOn: jar, type: JavaExec ) {
    main = 'hello.world.HelloWorld'
    classpath = sourceSets.main.runtimeClasspath
}

Ответ 2

Для этого используется плагин приложения .

apply plugin: 'application'
mainClassName = 'hello.world.HelloWorld'

И затем вызовите

gradle run

Помимо добавления задачи run, применение плагина application также изменит поведение задачи assemble. Теперь он будет создавать автономное приложение, которое можно запустить с помощью оболочки script.

Ответ 3

Рассмотрим этот build.gradle, который является упрощенной версией:

apply plugin: 'groovy'

task( hello, type: JavaExec ) {
    main = 'hello.world.HelloWorld'
    classpath = files('exampleDir/bin','jars/groovy-all-2.0.1.jar')
}

Обратите внимание на аргумент 'classpath' для задачи JavaExec. Это использует подкаталоги, такие как:

exampleDir/src/hello/world/HelloWorld.groovy
exampleDir/bin/hello/world/HelloWorld.class
jars/groovy-all-2.0.1.jar

где:

(a) groovy -all-2.0.1.jar, скопированный из моего объекта GROOVY_HOME/embeddable

(b) HelloWorld.groovy скомпилирован через groovyc и выглядит следующим образом:

package hello.world

class HelloWorld {
    public static void main(String[] args) {
        println "Hello World!"
    }
}

Ответ 4

Просто указать sourceSets.main.runtimeClasspath как путь к классам может быть недостаточно. Если вы видите NoClassDefFoundError, это может помочь:

task( hello, dependsOn: jar, type: JavaExec ) {
    main = 'hello.world.HelloWorld'
    classpath(sourceSets.main.runtimeClasspath, sourceSets.main.compileClasspath)
}