2011-10-23 53 views

回答

1

希望这段代码能给你一些关于它如何完成的见解。

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

然后就可以调用使用Task#execute()runJetty任务(注意,这个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() 
    } 
} 
+0

不幸的是,gradle的jetty插件对于看起来并不简单的设置来说并不是非常有用。所以,我排除了这个用于我的项目。目前,我可以很容易地从Java启动我的jetty服务器,并且我不能轻易地从gradle插件执行此操作,而不会搞乱XML。我真的不想那样做。 –

1

你不能这样做JavaExec;你将不得不编写自己的任务。

+0

不幸的是,这个任务不是更灵活。是否有计划允许JavaExec任务执行后台JVM进程? –

+0

我很确定这是一个问题。拉请求是受欢迎的。 –

4

我知道线程是从2011年开始的,但我仍然偶然发现了这个问题。因此,这里是用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

我更新从@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) 
    } 
}