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

时间:2011-10-23 03:42:34

标签: jetty gradle

我正在试图弄清楚如何启动一个生成Jetty服务器的JavaExec任务,而不会阻塞后续任务。此外,我将需要在构建完成后终止此服务器。知道我怎么能这样做吗?

4 个答案:

答案 0 :(得分:4)

我知道这个帖子来自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>'
}

答案 1 :(得分:4)

我更新了@chrishuen的解决方案,因为你不能再调用执行任务了。这是我的工作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)
  }
}

答案 2 :(得分:1)

你不能用JavaExec做到这一点;你必须自己编写任务。

答案 3 :(得分:1)

希望这段代码能够让您了解如何完成这项工作。

您可以使用构建侦听器闭包在构建开始/结束时运行代码。但是,出于某种原因,gradle.buildStarted闭包在里程碑-3中不起作用,所以我用gradle.taskGraph.whenReady替换它就可以了。

然后你可以使用runJetty调用Task#execute()任务(注意,这个API不是正式的,可能会消失),另外,从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()
  }
}