Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 如何使任务调用主类_Groovy_Gradle - Fatal编程技术网

Groovy 如何使任务调用主类

Groovy 如何使任务调用主类,groovy,gradle,Groovy,Gradle,我想做的是在build.gradle中创建一个任务,它将执行一个主类(带有main方法的类),但我不知道如何执行 我做了一个测试项目来测试如何做到这一点。以下是文件结构布局: testProject/ build.gradle src/main/groovy/hello/world/HelloWorld.groovy 以下是build.gradle的内容: apply plugin: 'groovy' apply plugin: 'maven' repositories {

我想做的是在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
所以,我的问题是:我怎样才能使
gradlehello
工作?非常感谢。

这样做是有好处的

apply plugin: 'application'
mainClassName = 'hello.world.HelloWorld'
然后打电话

gradle run

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

考虑一下这个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
”参数。这将使用子目录,例如:

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/Embeddeble中复制

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

package hello.world

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

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

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

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

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

好吧,如果我只想运行一个任务,那没关系。如果我有多个主类任务呢?那么你可以使用JavaExec任务。比公认的答案更简单、更优雅的解决方案。这对我不适用。尽管我的类位于src/main/java/gc/migrate中,但仍然会收到相同的错误。因此,应该起作用,但不起作用。apply plugin:'groovy'apply plugin:'application'mainClassName=“gc.migrate.MyMainClass”存储库{mavenCentral()}依赖项{compile'org.codehaus.groovy:groovy all:2.4.7'testCompile'junit:junit:4.12'}我在hello任务块中添加了以下行:classpath=files('build/libs/testProject.jar','build/classes/main'),它相当于您的类路径。但是,它不起作用。它抛出java.lang.NoClassDefFoundError:groovy/lang/GroovyObject。关于您的解决方案,我不太喜欢的另一个问题是手动管理依赖项,如groovy jar。对于您的第一个注释,您添加的内容显然与答案中的类路径不同。如果groovy是用groovyc编译的,那么groovy jar必须在类路径上才能使用它。当然,手动性质并不理想,但这是另一个问题。