2015-07-02 6 views
6

Ich verwende Gradle und Schluck, um meine JEE-Webanwendung zu erstellen und zu starten, die auf JDK6 + basiert, und der Web-Container ist Jetty.Wie führe ich einen externen Task (Exec) im Hintergrund aus?

Gulp wird verwendet, um statische Ressourcen wie concat zu verarbeiten und javascript/css-Dateien zu minimieren. Außerdem gibt es eine watch Aufgabe in meinem gulp Skript, es wird verwendet, um statische Dateiänderungen zu sehen und sie automatisch wieder aufzubauen.

So die Anwendung in Jetty zu starten, muss ich folgende Dinge tun: statische Ressource

  1. Bauen mit schluck [gulp task: build].
  2. Watch statischen Dateiänderungen [gulp task: watch], ich nicht diese Schluck-Task direkt aufrufen, ist es durch eine Task-Großansicht über Exec Klasse [gradle task: watch].
  3. Erstellen Sie meinen Java-Code und starten Sie Jetty [gradle task: jettyRun].

Da ich hinzugefügt, um die gradle Aufgabe watch als Abhängigkeit von jettyRun Aufgabe, so dass ich ich brauche allerdings nur gradle jettyRun von der Kommandozeile aufrufen, wird meine Anwendung gestartet werden. Aber das Ergebnis ist nicht dasselbe wie ich erwartet hatte.


Es folgt mein Skript-Dateien:

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:

The execute result

Frage:

Nun wird das Verfahren Hungs wenn Excutes die gradle watch Aufgabe, gibt es keine Änderung jettyRun Aufgabe für gradle auszuführen ist. Ich weiß, dass dieser Hang durch den von gulp gestarteten Überwachungsprozess verursacht wird, weil er Dateiänderungen beobachtet. Aber ich hoffe, dass Gradle nur den Schlucküberwachungsprozess startet und sofort zur Ausführung der nächsten jettyRun Aufgabe zurückkehrt!

Wie geht das? Außerdem möchte ich die Ausgabe von Watch Task von stdout sehen.

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

Download all files

+0

Does [diese] (http://stackoverflow.com/questions/7864205/run-javaexec-task-in-background-and-then-terminate-when-build-completes) helfen? Oder [dieses Plugin] (https://github.com/marcoVermeulen/gradle-spawn-plugin)? – Allen

+2

Ich denke nicht, dass Watch Task Teil des Builds sein sollte, es kann einmal aufgerufen werden und im Hintergrund laufen. Ich denke, es ist besser, die Überwachungsaufgabe zu trennen und sie in ein Startup-Skript zu schreiben. – Malloc

Antwort

2

Sie ProcessBuilder können einen externen Prozess im Hintergrund starten und lassen gradle mit anderen Aufgaben fortzusetzen.Auch finalizedBy kann verwendet werden, um die Wiedergabe zu stoppen, wenn runJetty abgeschlossen wurde.

task watch { 
    doFirst { 
     println("Start watching") 
     ext.process = new ProcessBuilder() 
      .directory(projectDir) 
      .command("gulp", "watch") 
      .start() 
    } 
} 

task stopWatching { 
    doFirst { 
     println("Stop watching") 
     if (tasks.watch.process != null) { 
      tasks.watch.process.destroy() 
     } 
    } 
} 

task runJetty { 
    finalizedBy stopWatching 
}