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

Jetty 在后台运行JavaExec任务,然后在构建完成时终止,jetty,gradle,Jetty,Gradle,我试图弄清楚如何启动一个JavaExec任务,在不阻塞后续任务的情况下生成Jetty服务器。此外,我还需要在构建完成后终止此服务器。你知道我怎么做吗?你不能用JavaExec;您必须编写自己的任务。希望这段代码能让您了解如何完成任务 您可以使用构建侦听器闭包在构建开始/完成时运行代码。然而,由于某种原因,gradle.buildStartedclosure在里程碑3中不起作用,因此我将其替换为gradle.taskGraph.whenReady,它起到了作用 然后,您可以使用task#execu

我试图弄清楚如何启动一个JavaExec任务,在不阻塞后续任务的情况下生成Jetty服务器。此外,我还需要在构建完成后终止此服务器。你知道我怎么做吗?

你不能用
JavaExec
;您必须编写自己的任务。

希望这段代码能让您了解如何完成任务

您可以使用构建侦听器闭包在构建开始/完成时运行代码。然而,由于某种原因,
gradle.buildStarted
closure在里程碑3中不起作用,因此我将其替换为
gradle.taskGraph.whenReady
,它起到了作用

然后,您可以使用
task#execute()
(注意,此API不是官方的,可能会消失),调用
runJetty
任务,此外,还可以从
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()
  }
}
import java.util.concurrent*

task myTask我知道这个线程是从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>'
}
import java.util.concurrent.Callable
导入java.util.concurrent.ExecutorService
导入java.util.concurrent.Executors
类RunAsyncTask扩展了DefaultTask{
字符串taskToExecute=“”
@任务行动
def startAsync(){
ExecutorService es=Executors.newSingleThreadExecutor()
提交({taskToExecute.execute()}可调用)
}
}
任务runRegistry(类型:RunAsyncTask,dependsOn:build){
taskToExecute=“”
}

我从@chrishuen更新了解决方案,因为您不能再调用execute on task。这是我的工作
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)
  }
}

不幸的是,gradle的jetty插件对于看起来并不简单的设置并不是非常有用。所以,我排除在我的项目中使用这个。目前,我可以很容易地从Java启动jetty服务器,如果不使用XML,我就不能很容易地从gradle插件启动jetty服务器。我真的不想那样做。不幸的是,这项任务没有更灵活。是否有任何计划允许JavaExec任务执行后台JVM进程?我很确定这是一个问题。欢迎拉取请求。