在后台运行JavaExec任务,然后在构建完成时终止

Ray*_*lus 7 jetty gradle

我试图找出如何启动JavaExec任务,该任务生成Jetty服务器而不会阻塞后续任务.此外,我将需要在构建完成后终止此服务器.知道我怎么能这样做吗?

chr*_*uen 5

我知道这个线程是 2011 年的,但我仍然偶然发现了这个问题。所以这是一个适用于 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>'
}
Run Code Online (Sandbox Code Playgroud)


rod*_*ion 1

希望这段代码能让您了解如何完成它。

您可以使用构建侦听器闭包在构建开始/结束时运行代码。然而,由于某种原因,gradle.buildStarted闭包在 Milestone-3 中不起作用,因此我将其替换为gradle.taskGraph.whenReady有效的方法。

然后,您可以runJetty使用调用该任务Task#execute()(请注意,此 API 不是官方的,可能会消失),此外,还可以从 an 运行它ExecutorService以获得一些异步行为。

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()
  }
}
Run Code Online (Sandbox Code Playgroud)