2013-08-12 23 views
11

Điều tôi đang cố gắng thực hiện là tạo một tác vụ trong build.gradle để thực hiện một lớp chính (lớp có phương thức chính), nhưng tôi không biết làm thế nào.Cách thực hiện nhiệm vụ gọi một lớp chính

Tôi đã thực hiện dự án thử nghiệm để kiểm tra cách thực hiện điều đó. Dưới đây là cách bố trí cấu trúc file:

testProject/ 
    build.gradle 
    src/main/groovy/hello/world/HelloWorld.groovy 

Dưới đây là nội dung của 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' 
} 

Dưới đây là nội dung của HelloWorld.groovy:

package hello.world 

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

Dưới đây là những gì tôi nhận được từ 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 

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể làm cho gradle hello hoạt động? Cảm ơn nhiều.

Trả lời

14

Sau một chút googling, tôi tìm thấy một giải pháp. Điều duy nhất tôi cần thay đổi là khối nhiệm vụ. Người đang làm việc được dán dưới đây:

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

Có một số application plugin để thực hiện việc này.

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

Và sau đó gọi

gradle run 

Bên cạnh đó thêm run nhiệm vụ, áp dụng ứng dụng plugin cũng sẽ thay đổi hành vi của assemble nhiệm vụ. Bây giờ nó sẽ tạo ra một ứng dụng độc lập có thể chạy với một kịch bản lệnh shell.

+0

Vâng, đó là tất cả các quyền nếu tôi chỉ muốn một nhiệm vụ để chạy. Nếu tôi có nhiều nhiệm vụ chính thì sao? – JBT

+0

Sau đó, bạn sử dụng tác vụ JavaExec. –

+0

Giải pháp đơn giản hơn và thanh lịch hơn câu trả lời được chấp nhận – kellyfj

2

Cân nhắc build.gradle này, đó là một phiên bản đơn giản:

apply plugin: 'groovy' 

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

Lưu ý 'classpath' tranh luận với nhiệm vụ JavaExec. Này sử dụng các thư mục con như:

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

nơi:

(a) groovy-all-2.0.1.jar sao chép từ GROOVY_HOME tôi/nhúng

(b) HelloWorld.groovy được biên soạn qua groovyc và như sau:

package hello.world 

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

Tôi đã thêm dòng sau vào khối lệnh hello: classpath = files (' build/libs/testProject.jar ',' build/classes/main '), tương đương với classpath của bạn. Tuy nhiên, nó không hoạt động. Nó ném java.lang.NoClassDefFoundError: groovy/lang/GroovyObject. – JBT

+0

Một vấn đề khác mà tôi không thích rất nhiều về giải pháp của bạn là tự quản lý các phụ thuộc như bình groovy. – JBT

+0

Đối với bình luận đầu tiên của bạn, phần bổ sung của bạn rõ ràng không tương đương với classpath trong câu trả lời. Nếu HelloWorld.groovy được biên dịch với groovyc, thì bình Groovy phải nằm trên đường dẫn lớp để sử dụng nó. Đúng là bản chất thủ công không phải là lý tưởng, nhưng đó là một vấn đề riêng biệt. –

0

Chỉ định sourceSets.main.runtimeClasspath làm đường dẫn lớp có thể không đủ. Nếu bạn thấy NoClassDefFoundError, điều này có thể hữu ích:

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