使用Java和Gradle创建控制台应用程序

65

我正在使用Java和gradle编写控制台应用程序。我正在使用application插件并已在build.gradle中正确配置所需的字段。

在我的主类中,我将BufferedReaderSystem.in链接起来。问题在于:当我在项目目录中运行gradle run时,读取器不等待我的控制台输入。相反,BufferedReader#readLine在第一次调用时返回null。这种行为与我的需求不符。

解决方案是什么?是否有适用于gradle的单独的控制台应用程序插件,或者我需要对application插件进行某些调整以满足我的需求?


1
四年后!如果您正在运行Windows操作系统,我刚刚发现通过从Cygwin终端运行任务,这个烦人的“> Building…”东西不会出现。但我也发现,只有在特别定义的“task”内部放置standardInput = System.in才适用于我,而不是在run内部。 - mike rodent
1
我认为这是Gradle的一个缺陷。 - Robert
Gradle相关问题:https://github.com/gradle/gradle/issues/1251 和 https://github.com/gradle/gradle/issues/2842 - jcsahnwaldt Reinstate Monica
4个回答

115

默认情况下,Gradle构建的system.in未连接到run(JavaExec)任务的system.in。您可以执行以下操作:

build.gradle(Groovy语法):

run {
    standardInput = System.in
}

build.gradle.kts(Kotlin DSL 语法):

tasks.named<JavaExec>("run") {
    standardInput = System.`in`
}

3
谢谢!帮助很大。现在是否有方法可以避免在提示用户输入时打印 > Building > :run - missingfaktor
4
很遗憾目前还不支持。我之前已经提出了这个问题:http://issues.gradle.org/browse/GRADLE-1147,你可以投票支持。 - Rene Groeschke
2
我尝试了完全相同的事情,但Gradle卡住了,如果我输入,命令行上没有任何输入被打印出来。我做错了什么吗? - Giovanni Botta
1
我对此有个Stack Overflow的解决方案。 - Giovanni Botta
2
请在要求输入后使用--console=plain参数,这样不会打印任何内容。 - Alireza Ahmadi
显示剩余2条评论

38

这个执行状态会破坏输出,当我想使用回车时(它会在每一行上重复)。你知道如何禁用它而不使用--console=plain吗?因为它也会禁用回车处理。 - Yevhenii Nadtochii

4

对于 build.gradle.kts 文件:

tasks.getByName<JavaExec>("run") {
    standardInput = System.`in`
}

我还发现你可以这样做:(tasks.run) { standardInput = /* ... */ } - undefined

-4
很有可能,问题出在你的Java代码上。应用程序插件所做的只是编译Java代码并运行您指定的主类。您能否发布您为应用程序插件指定的主类中的代码?


我也在IntelliJ IDEA中运行了这段代码。通过右键单击文件并选择“Run <classname>.main”。它在那里完美地工作。 - missingfaktor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接