【问题标题】:Console application with Java and gradle带有 Java 和 gradle 的控制台应用程序
【发布时间】:2012-10-21 17:58:27
【问题描述】:

我正在使用 Java 和 gradle 编写控制台应用程序。我正在使用application plugin 并在build.gradle 中正确配置了必填字段。

在我的主要课程中,我有 BufferedReaderSystem.in 链接。这是问题所在:当我在项目目录中运行gradle run 时,阅读器不会等待我的控制台输入。 BufferedReader#readLine 在第一次调用时返回 null。这种行为对于我正在做的事情是不可取的。

解决办法是什么?是否有用于 gradle 的单独控制台应用程序插件,或者我是否需要以某种方式调整 application 插件以满足我的需求?

【问题讨论】:

  • 4 年后!如果您运行的是 Windows 操作系统,我刚刚发现通过从 Cygwin 终端运行任务,这个烦人的“> Building ...”不会出现。但我还发现,如果我将 standardInput = System.in 放入特别定义的 task 中,则将其放入 standardInput = System.in 仅适用于我,而不是在 run 中。
  • 我认为这是 Gradle 中的一个缺陷。

标签: java console-application gradle


【解决方案1】:

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

// build.gradle (Groovy syntax)
run {
    standardInput = System.in
}

// build.gradle.kts (Kotlin syntax)
tasks.named<JavaExec>("run") {
    standardInput = System.`in`
}

【讨论】:

  • 谢谢!这是一个很大的帮助。现在有没有办法在提示用户下次输入时避免打印&gt; Building &gt; :run
  • 很遗憾目前没有。我刚才提出了一个问题:issues.gradle.org/browse/GRADLE-1147你可以投票。
  • 再次感谢您。这也行。接受你的回答。 :)
  • 我尝试了同样的事情,但 Gradle 卡住了,如果我输入,没有输入会打印到命令行。我做错了吗?
  • 我有一个SO
【解决方案2】:

如上所述,添加

run {
   standardInput = System.in
}

然后运行:

gradle console:run -q --console=plain

地点:

  • -q 以“安静”模式运行任务(以避免出现&gt; Building &gt; :run
  • --console=plain 删除执行状态:&lt;=-&gt; 80% EXECUTING [TIME]

来源:https://docs.gradle.org/current/userguide/gradle_command_line.html

【讨论】:

  • 当我想使用回车时,这个执行状态会破坏输出(它在每一行重复)。你知道如何在没有 --console=plain 的情况下禁用它,因为它还会禁用回车处理
【解决方案3】:

对于build.gradle.kts

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

【讨论】:

    【解决方案4】:

    很可能,问题在于您的 java 代码。应用程序插件所做的只是编译 java 代码,并运行您指定的主类。您可以在为应用程序插件 (mainClassName) 指定的主类中发布代码吗?

    【讨论】:

    • 我也在 IntelliJ IDEA 中运行了代码。 (通过右键单击文件并选择Run &lt;classname&gt;.main。)它在那里工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多