Как выполнить основной класс в банке из gradle с помощью команды "java"

У меня есть эти файлы в папке <project_root>:

./build.gradle
./build/libs/vh-1.0-SNAPSHOT.jar
./libs/groovy-all-2.1.7.jar
./src/main/groovy/vh/Main.groovy

В файле build.gradle у меня есть эта задача:

task vh( type:Exec ) {
    commandLine 'java -cp libs/groovy-all-2.1.7.jar:build/libs/' +
            project.name + '-' + version + '.jar vh.Main'
}

Файл Main.groovy прост:

package vh

class Main {
    static void main( String[] args ) {
        println 'Hello, World!'
    }

}

После ввода строковых значений в командной строке:

java -cp libs/groovy-all-2.1.7.jar:build/libs/vh-1.0-SNAPSHOT.jar vh.Main

Если я запускаю команду непосредственно из оболочки, я получаю правильный вывод. Однако, если я запустил gradle vh, он потерпит неудачу. Итак, как мне заставить его работать? Большое вам спасибо.

Ответ 1

Exec.commandLine ожидает список значений: одно значение для исполняемого файла и другое значение для каждого аргумента. Чтобы выполнить код Java, лучше использовать задачу JavaExec:

task vh(type: JavaExec) {
    main = "vh.Main"
    classpath = files("libs/groovy-all-2.1.7.jar", "build/libs/${project.name}-${version}.jar")
} 

Как правило, вам не нужно жестко указывать путь класса. Например, если вы используете плагин groovy, а groovy-all уже объявлен как зависимость compile (и зная, что второй Jar создан из источников main), вы бы скорее сделали:

classpath = sourceSets.main.runtimeClasspath

Чтобы узнать больше о типах задач Exec и JavaExec, обратитесь к Gradle Справочник по языку сборки.