gpt4 book ai didi

gradle - 引用 Gradle 中使用 JavaExec 创建的子进程

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

我有一个使用 JavaExec 类型的任务调用 Java 进程的 Gradle 任务。它看起来像这样 -

task runScript (dependsOn: 'classes', type: JavaExec) {
main = 'org.my.package.MyClass'
classpath = sourceSets.main.runtimeClasspath
}

它很好用,只是我不知道如何获得对以这种方式创建的子进程的引用。

我想在我的 Gradle 脚本中注册一个关闭 Hook ,并在我的 Gradle 脚本创建的子进程上调用关闭。有没有办法做到这一点?

我遇到的问题是,如果我终止 Gradle 进程(使用 ctrl+c)。 Gradle 本身会死掉,但使用 Gradle 任务生成的子进程仍然存在。如果我的 Gradle 进程捕获到终止信号,我希望能够在子进程上调用关闭。

最佳答案

似乎对我有用......如果我使用以下 gradle 脚本:

apply plugin: "java"

repositories {
mavenCentral()
}

dependencies {
}

task runScript(dependsOn: 'classes', type: JavaExec) {
main = 'test.Main'
classpath = sourceSets.main.runtimeClasspath
}

然后在 src/main/java/test我将以下内容放入 Main.java (Java 8)
package test;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("FINISHING")));
new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(() -> System.out.println("PING"), 0, 1, TimeUnit.SECONDS);
}
}

然后(使用 Gradle 2.12),如果我运行 runScript任务,我看到输出:
$ gradle runScript
:compileJava
:processResources UP-TO-DATE
:classes
:runScript
PING
PING
PING

然后,当我按 CTRL-C ,它打印:
> FINISHING
[0m> Building 75% > :runScript
$

并停下...

所以关闭钩子(Hook)被称为......

这是你看到的吗?

因此,为了使用 Groovy 类对其进行测试,我将上面的 build.gradle 更改为:
apply plugin: "groovy"

repositories {
mavenCentral()
}

dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.6'
}

task runScript(dependsOn: 'classes', type: JavaExec) {
main = 'test.Main'
classpath = sourceSets.main.runtimeClasspath
}

task gRunScript(dependsOn: 'classes', type: JavaExec) {
main = 'test.GMain'
classpath = sourceSets.main.runtimeClasspath
}

然后添加了一个 Groovy 类(在 src/main/groovy/test/GMain.groovy 中)
package test

import java.util.concurrent.ScheduledThreadPoolExecutor
import java.util.concurrent.TimeUnit

class GMain {
static main(args) {
Runtime.runtime.addShutdownHook(new Thread({ -> println 'GFINISHING' }))
new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate({ -> println "GPING"}, 0, 1, TimeUnit.SECONDS)
}
}

并运行 gRunScript (而不是 runScript )给了我输出:
$ gradle gRunScript
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:gRunScript
GPING
GPING
> GFINISHING
> Building 80% > :gRunScript

并停下...

所以关闭钩子(Hook)被称为......

关于gradle - 引用 Gradle 中使用 JavaExec 创建的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36750964/

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