Wie führe ich eine externe Gradle-Aufgabe (Exec) im Hintergrund aus?

Ich verwende gradle und gulp, um meine JEE-Webanwendung zu erstellen und zu starten, die auf JDK6 + basiert, und der Webcontainer ist Jetty.

Gulp wird verwendet, um statische Ressourcen zu verarbeiten, z. B. concat und Javascript- / CSS-Dateien zu minimieren. Es gibt auch einwatch Aufgabe in meinem Gulp-Skript, es wird verwendet, um statische Dateiänderungen zu beobachten und sie automatisch neu zu erstellen.

Also, um die Anwendung in Jetty zu starten, muss ich folgende Dinge tun:

Statische Ressource mit gulp @ erstell[gulp task: build].Watch statische Dateiänderungen[gulp task: watch], ich rufe diese gulp-aufgabe nicht direkt auf, sie wird von einer gradle-aufgabe über @ aufgeruf Exec class[gradle task: watch].Meinen Java-Code erstellen und Jetty @ start[gradle task: jettyRun].

Seit ich die gradle Aufgabe hinzugefügt habewatch als Abhängigkeit vonjettyRun Aufgabe, so dass ich obwohl ich nur @ anrufen mugradle jettyRun von der Kommandozeile wird meine Anwendung gestartet. Aber das Ergebnis ist nicht das gleiche wie ich erwartet hatte.

Folgend sind meine Skriptdateien:

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();
});

Das Ergebnis

Frage

Now, der Prozess hungs wenn das @ excutgradle watch task, es gibt keine Änderung, die ausgeführt werden mussjettyRun Aufgabe für Gradle. Ich weiß, dass dieses Hängen durch den Überwachungsprozess verursacht wird, der von gulp gestartet wird, weil er Dateiänderungen überwacht. Aber ich hoffe, dass gradle nur den gulp watch-Prozess startet und sofort zurückkehrt, um das nächste @ auszuführejettyRun task!

Wie macht man das? Außerdem möchte ich die Ausgabe der Überwachungsaufgabe von stdout sehen.

Ich weiß, dass es einen ProcessBuilder in Java gibt, ich habe es versucht, aber es funktioniert nicht. Vielleicht habe ich etwas falsch gemacht. :

Alle Dateien herunterladen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage