後続のタスクをブロックせずにJettyサーバーを起動するJavaExecタスクを起動する方法を理解しようとしています。また、ビルドが完了したら、このサーバーを終了する必要があります。どのように私はこれを行うことができます任意のアイデア?バックグラウンドでJavaExecタスクを実行し、ビルドが完了すると終了する
答えて
このスニペットでは、どのように行うことができるかについての洞察を得ることができます。
ビルド開始/終了時にコードを実行するために、ビルドリスナクロージャを使用できます。しかし何らかの理由で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()
}
}
JavaExec
で行うことはできません。あなた自身の仕事を書く必要があります。
この仕事はそれほど柔軟ではないことは残念です。 JavaExecタスクがバックグラウンドJVMプロセスを実行できるようにする計画はありますか? –
私はそれに問題があると確信しています。プルのリクエストは大歓迎です。 –
私はスレッドが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>'
}
あなたはもう、タスクで実行呼び出すことはできませんので、私は@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)
}
}
- 1. アプリケーションが終了した場合のバックグラウンドでのタスクの実行
- 2. 子スレッドが実行を完了する前にメインスレッドが終了しますか?
- 3. アプリを終了してバックグラウンドで実行する
- 4. ASyncタスクが終了した後にアンドロイドサービスを終了する方法完了しましたか?
- 5. 終了前にアニメーション完了ブロックを実行しますか?
- 6. タスクが完了する前にNodeJS非同期処理が終了する
- 7. タスクが終了したらUIAlertViewを終了します
- 8. 新しいビルドまたは実行時にNetbeansを実行し、前のタスクを終了する
- 9. フォークが完了する前にDockerが終了しますか?
- 10. タスクの完了
- 11. タスクをキャンセルするか、タスクの実行を即座に終了するには?
- 12. Eclipse - Eclipseのシャットダウン/終了時にタスクを実行する
- 13. JNI - ネイティブスレッドの実行が終了する前にJavaが終了する
- 14. タスクが実行中で終了できません
- 15. サービス実行が終了する
- 16. クライアントが接続を終了すると、完了ポートスレッドがリークしています
- 17. エラー:タスクの実行に失敗し、終了値が1以外で終了しました。
- 18. 無言の時計が終了した後にタスクを実行するには?
- 19. C#終了タスクが終了しないプロセス
- 20. ビルド後のイベントでバッチファイルを実行中:エラー46コマンド....終了コード9009で終了する
- 21. プログラムが終了すると `exec`でプロセスを終了する
- 22. Camundaカスタムタスクリスト - 完了タスク
- 23. アクティビティが終了するとUploadServiceBroadcastReceiverが終了します
- 24. セッションが終了したときにスクリプトを実行する
- 25. pthreadが終了したときに関数を実行する
- 26. javaからシェルスクリプトを実行中 - 完了していないタスク
- 27. UIToolBarの完了ボタンを使用してUIPickerViewを終了する
- 28. SQLクエリを実行するとアプリケーションが強制終了する
- 29. AppDelegateにタスクがない場合、バックグラウンドでタスクを終了するにはどうすればよいですか?
- 30. 実行中のサブプロセスコールを終了する
残念ながら、gradle用のjettyプラグインは、汚れていないような設定にはあまり役に立ちません。だから、私は自分のプロジェクトにこれを使用することを拒否しています。現在、私はjettyサーバーをJavaから非常に簡単に起動することができますし、XMLを邪魔することなくgraleプラグインから簡単にこれを行うことはできません。私は本当にそれをしたくありません。 –