如何创建一个调用主类的任务

时间:2013-08-12 19:23:41

标签: groovy gradle

我想要做的是在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 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:9)

这样做有application plugin

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

然后致电

gradle run

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

答案 2 :(得分: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!"
    }
}

答案 3 :(得分:0)

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

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