Como executar uma tarefa externa gradle (Exec) em segundo plano?
Estou usando gradle e gulp para criar e iniciar meu aplicativo da web JEE baseado no JDK6 +, e o contêiner da web é o Jetty.
Gulp é usado para processar recursos estáticos, como concat e minify arquivos javascript / css. Além disso, há umwatch
tarefa no meu script gulp, é usado para observar alterações estáticas de arquivos e reconstruí-las automaticamente.
Então, para iniciar o aplicativo no Jetty, preciso fazer o seguinte:
Criar recurso estático usando gulp[gulp task: build]
.Assista a alterações de arquivos estáticos[gulp task: watch]
, eu não chamo essa tarefa gulp diretamente, é chamada por uma tarefa gradle viaExec classe[gradle task: watch]
.Construa meu código java e inicie o Jetty[gradle task: jettyRun]
.Desde que eu adicionei a tarefa gradlewatch
como uma dependência dejettyRun
tarefa, então eu só preciso ligargradle jettyRun
a partir da linha de comando, meu aplicativo será iniciado. Mas o resultado não é o mesmo que eu esperava.
A seguir, meus arquivos de script:
build.gradle
apply plugin: 'war'
apply plugin: 'jetty'
repositories {
jcenter()
}
// omit the dependencies here
task watch(type: Exec){
workingDir "${projectDir}"
// Pass build type to npm and gulp.
commandLine "gulp", "watch"
}
jettyRun.dependsOn watch
gulpfile.js
var gulp = require('gulp');
gulp.task('build', function(callback) {
// removed the code to make this question as simple as possible.
if (callback != null) callback();
});
gulp.task('watch', function(callback) {
gulp.watch(['./src/static/**/*.js'], ['build']);
if (callback != null) callback();
});
O resultado:
Pergunta, questão:
Agora, o processo é interrompido quando dispensa ogradle watch
tarefa, não há alteração para executarjettyRun
tarefa para gradle. Eu sei que esse travamento é causado pelo processo de inspeção iniciado pelo gulp, porque está observando alterações no arquivo. Mas espero que o gradle apenas inicie o processo de gulp watch e retorne imediatamente para executar a próximajettyRun
tarefa!
Como fazer isso? Além disso, eu quero ver a saída da tarefa watch do stdout.
Eu sei que existe um ProcessBuilder em java, eu tentei, mas não funciona. Talvez eu tenha feito algo errado. :(