Groovy 如何使任务调用主类
我想做的是在build.gradle中创建一个任务,它将执行一个主类(带有main方法的类),但我不知道如何执行 我做了一个测试项目来测试如何做到这一点。以下是文件结构布局: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 {
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必须在类路径上才能使用它。当然,手动性质并不理想,但这是另一个问题。