11

我想做的是在 build.gradle 中创建一个任务,该任务将执行一个主类(具有 main 方法的类),但我不知道如何。

我做了一个测试项目来测试如何做到这一点。这是文件结构布局:

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!"
    }
}

这是我从 shell 中得到的:

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工作?非常感谢你。

4

4 回答 4

15

经过一番谷歌搜索,我找到了解决方案。我唯一需要改变的是任务块。工作的粘贴在下面:

task( hello, dependsOn: jar, type: JavaExec ) {
    main = 'hello.world.HelloWorld'
    classpath = sourceSets.main.runtimeClasspath
}
于 2013-08-14T23:44:32.983 回答
9

有一个应用程序插件可以做到这一点。

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

然后打电话

gradle run

除了添加run任务,应用应用插件也会改变assemble任务的行为。现在它将生成一个可以使用 shell 脚本运行的独立应用程序。

于 2013-08-12T19:31:12.560 回答
2

考虑一下这个 build.gradle,它是一个简化版本:

apply plugin: 'groovy'

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

注意JavaExec任务的“ classpath”参数。这使用子目录,例如:

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

在哪里:

(a) 从我的 GROOVY_HOME/embeddable 复制的 groovy-all-2.0.1.jar

(b) HelloWorld.groovy 通过 groovyc 编译,如下:

package hello.world

class HelloWorld {
    public static void main(String[] args) {
        println "Hello World!"
    }
}
于 2013-08-13T01:59:26.720 回答
0

仅将 sourceSets.main.runtimeClasspath 指定为类路径可能还不够。如果您看到 NoClassDefFoundError 这可能会有所帮助:

task( hello, dependsOn: jar, type: JavaExec ) {
    main = 'hello.world.HelloWorld'
    classpath(sourceSets.main.runtimeClasspath, sourceSets.main.compileClasspath)
}
于 2016-02-18T01:49:01.977 回答