【发布时间】:2014-04-29 08:32:26
【问题描述】:
我有一个由几个子项目组成的 Gradle 项目。我刚刚创建了一个新的,以添加对我想运行的交互式 Groovy shell 的支持:
gradle console
或
gradle console:run
所以我的新console 模块的build.gradle 文件如下:
apply plugin: 'groovy'
apply plugin:'application'
mainClassName = 'org.codehaus.groovy.tools.shell.Main'
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.2.2'
compile 'org.fusesource.jansi:jansi:1.11'
compile 'commons-cli:commons-cli:1.2'
compile 'jline:jline:2.11'
compile project(':my-module')
}
task(console, dependsOn: 'classes', type: JavaExec) {
main = 'org.codehaus.groovy.tools.shell.Main'
classpath = sourceSets.main.runtimeClasspath
}
但是,当我运行 gradle :console:run 或 gradle console 时,我会得到类似:
:console:run
Groovy Shell (2.2.2, JVM: 1.6.0_45)
Type 'help' or '\h' for help.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000>
BUILD SUCCESSFUL
Total time: 4.529 secs
giovanni@mylaptop:~/Projects/my-project$
所以交互式 shell 似乎启动了,但它立即退出。
我做错了吗?
编辑:在 build.gradle 文件中添加了以下内容:
run.standardInput = System.in
现在从输入流中读取标准输入(感谢 cmets)。
但是,Gradle 似乎陷入了困境:
Groovy Shell (2.2.2, JVM: 1.6.0_45)
Type 'help' or '\h' for help.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000>
> Building 88% > :console:run
并且不接受任何输入。即使这会导致同样的事情:
gradle --no-daemon console:run
2018 年更新:
Dylons 接受的答案似乎不再起作用,./gradlew console 立即退出:
$ ./gradlew console
配置项目: Task.leftShift(Closure) 方法已被弃用,并计划在 Gradle 5.0 中删除。请改用 Task.doLast(Action)。 在 build_8qb2gvs00xed46ejq1p63fo92.run(/home/jhe052/eclipse-workspace/QuinCe/build.gradle:118) (使用 --stacktrace 运行以获取此弃用警告的完整堆栈跟踪。)
在 3 秒内构建成功 3 个可操作的任务:1 个已执行,2 个是最新的
将 leftShift (
$ ./gradlew --version
Gradle 4.4.1
构建时间:2017-12-20 15:45:23 UTC 修订:10ed9dc355dc39f6307cc98fbd8cea314bdd381c
Groovy:2.4.12 Ant:2017 年 2 月 2 日编译的 Apache Ant(TM) 版本 1.9.9 JVM:1.8.0_151(甲骨文公司 25.151-b12) 操作系统:Linux 4.13.0-32-generic amd64
【问题讨论】:
-
您是否尝试并调试过看看会发生什么?我怀疑 shell 看到 EOF 这就是它退出的原因
-
如何调试它?我正在从命令行运行。如果你是对的,那么必须有一个 Gradle 选项来不发送到控制台 EOF。
-
在此之前,虽然我不知道应用程序插件,但是否有可能分叉?另一个“凭空而来”的假设是,既然你不 fork,那么使用的 JVM 就是运行 gradle 的那个,而 gradle 在启动时会关闭 stdin
-
这是个好问题。我相信它确实会分叉。
-
是的,它在 child process 中。