gpt4 book ai didi

gradle - 如何在后台执行gradle外部任务(Exec)?

转载 作者:行者123 更新时间:2023-12-04 12:30:35 55 4
gpt4 key购买 nike

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

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

因此,要在 Jetty 中启动应用程序,我需要执行以下操作:

  • 使用 gulp 构建静态资源 [gulp task: build] .
  • 观看静态文件更改 [gulp task: watch] ,我不直接调用这个 gulp 任务,它是通过 Exec 类的 gradle 任务调用的 [gradle task: watch] .
  • 构建我的 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();
    });

    结果:

    The execute result

    问题:

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

    这该怎么做?另外,我想从标准输出中查看监视任务的输出。

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

    Download all files

    最佳答案

    您可以使用 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
    }

    关于gradle - 如何在后台执行gradle外部任务(Exec)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31189351/

    55 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com