我想要做的是在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
工作?非常感谢你。
答案 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)
}