【问题标题】:How to execute a gradle external task (Exec) in background?如何在后台执行 gradle 外部任务(Exec)?
【发布时间】:2015-07-02 15:58:07
【问题描述】:

我正在使用 gradle 和 gulp 构建和启动我的基于 JDK6+ 的 JEE Web 应用程序,Web 容器是 Jetty。

Gulp 用于处理静态资源,例如 concat 和 minify javascript/css 文件。另外,我的 gulp 脚本中有一个watch 任务,它用于监视静态文件的更改并自动重建它们。

所以要在 Jetty 中启动应用程序,我需要做以下事情:

  1. 使用 gulp [gulp task: build] 构建静态资源。
  2. 观察静态文件变化[gulp task: watch],我不直接调用这个gulp任务,它是由gradle任务通过Exec类调用[gradle task: watch]
  3. 构建我的 java 代码并启动 Jetty [gradle task: jettyRun]

由于我添加了 gradle 任务 watch 作为 jettyRun 任务的依赖项,所以虽然我只需要从命令行调用 gradle jettyRun,我的应用程序将被启动。但结果和我预想的不一样。


以下是我的脚本文件:

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

结果:

问题:

现在,执行gradle watch 任务时进程挂起,对于gradle 执行jettyRun 任务没有任何变化。我知道这个挂起是由 gulp 启动的监视进程引起的,因为它正在监视文件更改。但我希望 gradle 只启动 gulp watch 进程并立即返回执行下一个jettyRun 任务!

如何做到这一点?另外,我想从标准输出中查看监视任务的输出。

我知道java中有一个ProcessBuilder,我试过了,但它不起作用。也许我做错了什么。 :(

Download all files

【问题讨论】:

  • this 有帮助吗?还是this plugin
  • 我不认为监视任务应该是构建的一部分,它可以被调用一次并一直在后台运行。我觉得还是把watch任务分离出来放到一些服务器启动脚本里面比较好。

标签: gradle jetty gulp


【解决方案1】:

您可以使用ProcessBuilder 在后台启动外部进程,让 gradle 继续执行其他任务。此外,finalizedBy 可用于在 runJetty 完成后停止观看。

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
}

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多