2011-10-23 25 views

Trả lời

1

Hy vọng đoạn mã này sẽ cung cấp cho bạn một số thông tin chi tiết về cách thực hiện.

Bạn có thể sử dụng đóng trình nghe xây dựng để chạy mã khi bắt đầu/kết thúc xây dựng. Tuy nhiên, vì một lý do nào đó, việc đóng cửa gradle.buildStarted không hoạt động trong cột mốc-3, vì vậy tôi đã thay thế nó bằng gradle.taskGraph.whenReady.

Sau đó, bạn có thể gọi nhiệm vụ runJetty bằng cách sử dụng Task#execute() (Lưu ý, API này không chính thức và có thể biến mất), và bổ sung, chạy nó từ ExecutorService để nhận một số hành vi không đồng bộ.

import java.util.concurrent.* 

task myTask << { 
    println "Do usual tasks here" 
} 

task runJetty << { 
    print "Pretend we are running Jetty ..." 
    while(!stopJetty){ 
    Thread.sleep(100) 
    } 
    println "Jetty Stopped." 
} 

stopJetty = false 
es = Executors.newSingleThreadExecutor() 
jettyFuture = null 

//gradle.buildStarted { ... } 
gradle.taskGraph.whenReady { g -> 
    jettyFuture = es.submit({ runJetty.execute() } as Callable) 
} 

gradle.buildFinished { 
    println "Stopping Jetty ... " 
    stopJetty = true 

    //This is optional. Could be useful when debugging. 
    try{ 
    jettyFuture?.get() 
    }catch(ExecutionException e){ 
    println "Error during Jetty execution: " 
    e.printStackTrace() 
    } 
} 
+0

Thật không may, các plugin cầu nối cho gradle không phải là terribly hữu ích cho các thiết lập mà không phải là bẩn đơn giản có vẻ như. Vì vậy, tôi quyết định sử dụng điều này cho dự án của tôi. Hiện tại, tôi có thể khởi động máy chủ jetty của tôi rất dễ dàng từ Java và tôi không thể dễ dàng làm điều này từ plugin gradle mà không gây rối với XML. Tôi thực sự không muốn làm điều đó. –

1

Bạn không thể làm điều đó với JavaExec; bạn sẽ phải viết nhiệm vụ của riêng bạn.

+0

Thật không may là nhiệm vụ này không linh hoạt hơn. Có bất kỳ kế hoạch nào để cho phép các tác vụ JavaExec thực thi các quy trình JVM nền không? –

+0

Tôi chắc chắn có vấn đề với nó. Yêu cầu kéo được hoan nghênh. –

4

Tôi biết chủ đề là từ năm 2011, nhưng tôi vẫn tình cờ gặp vấn đề. Vì vậy, đây là giải pháp hoạt động với Gradle 2.14:

import java.util.concurrent.Callable 
import java.util.concurrent.ExecutorService 
import java.util.concurrent.Executors  

class RunAsyncTask extends DefaultTask { 
    String taskToExecute = '<YourTask>' 
    @TaskAction 
    def startAsync() { 
     ExecutorService es = Executors.newSingleThreadExecutor() 
     es.submit({taskToExecute.execute()} as Callable) 
    } 
} 


task runRegistry(type: RunAsyncTask, dependsOn: build){ 
    taskToExecute = '<NameOfYourTaskHere>' 
} 
3

Tôi đã cập nhật giải pháp từ @chrishuen vì bạn không thể thực hiện nhiệm vụ được nữa. Đây là hoạt động của tôi build.gradle

import java.time.LocalDateTime 
import java.util.concurrent.Callable 
import java.util.concurrent.ExecutorService 
import java.util.concurrent.Executors 

group 'sk.bsmk' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 

task wrapper(type: Wrapper) { 
    gradleVersion = '3.4' 
} 

class RunAsyncTask extends DefaultTask { 
    @TaskAction 
    def startAsync() { 
    ExecutorService es = Executors.newSingleThreadExecutor() 
    es.submit({ 
     project.javaexec { 
     classpath = project.sourceSets.main.runtimeClasspath 
     main = "Main" 
     } 
    } as Callable) 

    } 
} 

task helloAsync(type: RunAsyncTask, dependsOn: compileJava) { 
    doLast { 
    println LocalDateTime.now().toString() + 'sleeping' 
    sleep(2 * 1000) 
    } 
} 
Các vấn đề liên quan