2015-07-02 16 views
6

Tôi đang sử dụng gradle và gulp để xây dựng và khởi chạy ứng dụng web JEE của mình dựa trên JDK6 + và vùng chứa web là Jetty.Làm thế nào để thực hiện một tác vụ bên ngoài gradle (Exec) trong nền?

Gulp được sử dụng để xử lý tài nguyên tĩnh, chẳng hạn như concat và rút gọn tệp javascript/css. Ngoài ra, có một tác vụ watch trong tập lệnh gulp của tôi, nó được sử dụng để xem các thay đổi tệp tĩnh và tự động tạo lại chúng.

Vì vậy, để khởi động các ứng dụng trong Jetty, tôi cần phải làm những việc sau đây:

  1. xây dựng tài nguyên tĩnh nhờ sủ dụng ngụm [gulp task: build].
  2. Xem các thay đổi tệp tĩnh [gulp task: watch], tôi không gọi trực tiếp tác vụ gulp này, nhiệm vụ được gọi bằng công việc gradle qua Exec lớp [gradle task: watch].
  3. Tạo mã java của tôi và khởi chạy Jetty [gradle task: jettyRun].

Kể từ khi tôi thêm nhiệm vụ gradle watch như một sự phụ thuộc của jettyRun nhiệm vụ, vì vậy tôi mặc dù tôi chỉ cần gọi gradle jettyRun từ dòng lệnh, ứng dụng của tôi sẽ được đưa ra. Nhưng kết quả không giống như tôi mong đợi.


Sau đây là file kịch bản của tôi:

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

Kết quả:

The execute result

Câu hỏi:

Bây giờ, Hungs quá trình khi excutes nhiệm vụ gradle watch, không có thay đổi để thực hiện nhiệm vụ jettyRun cho gradle. Tôi biết điều này là do quá trình xem được đưa ra bởi gulp, bởi vì nó đang xem các thay đổi của tập tin. Nhưng tôi hy vọng rằng gradle chỉ mới khởi chạy quy trình xem gulp và quay lại ngay lập tức để thực hiện tác vụ tiếp theo jettyRun!

Cách thực hiện việc này? Ngoài ra, tôi muốn xem đầu ra của nhiệm vụ đồng hồ từ stdout.

Tôi biết có một ProcessBuilder trong java, tôi đã thử nó, nhưng nó không hoạt động. Có lẽ tôi đã làm điều gì sai. :(

Download all files

+0

[this] (http://stackoverflow.com/questions/7864205/run-javaexec-task-in-background-and-then-terminate-when-build-completes) có giúp được không? Hoặc [plugin này] (https://github.com/marcoVermeulen/gradle-spawn-plugin)? – Allen

+2

Tôi không nghĩ rằng nhiệm vụ xem nên là một phần của xây dựng, nó có thể được gọi một lần và chạy trong nền tất cả các thời gian. Tôi nghĩ tốt hơn là tách công việc theo dõi và đặt nó vào một số tập lệnh khởi động. – Malloc

Trả lời

2

Bạn có thể sử dụng ProcessBuilder để khởi động một quá trình mở ở chế độ nền và để gradle tiếp tục với công việc khác.Cũng có thể sử dụng finalizedBy để dừng xem khi runJetty hoàn tất.

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 
} 
Các vấn đề liên quan