2011-10-23 60 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プラグインは、汚れていないような設定にはあまり役に立ちません。だから、私は自分のプロジェクトにこれを使用することを拒否しています。現在、私はjettyサーバーをJavaから非常に簡単に起動することができますし、XMLを邪魔することなくgraleプラグインから簡単にこれを行うことはできません。私は本当にそれをしたくありません。 –

1

JavaExecで行うことはできません。あなた自身の仕事を書く必要があります。

+0

この仕事はそれほど柔軟ではないことは残念です。 JavaExecタスクがバックグラウンドJVMプロセスを実行できるようにする計画はありますか? –

+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>' 
} 
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) 
    } 
} 
関連する問題