当应用程序以gradle run启动时,java.util.scanner抛出NoTouchElementException

当应用程序以gradle run启动时,java.util.scanner抛出NoTouchElementException,java,gradle,java.util.scanner,build.gradle,stdin,Java,Gradle,Java.util.scanner,Build.gradle,Stdin,我创建了一个简单的java“echo”应用程序,它接收用户的输入并向他们展示,以演示问题。我可以使用IntelliJ的内部“run”命令运行此应用程序,并且在执行由gradle build生成的编译后的java文件时也可以运行此应用程序。但是,如果我尝试使用gradle run执行应用程序,我会从扫描仪中抛出一个NoTouchElementException 我认为gradle或应用插件在系统IO上做了一些奇怪的事情 应用程序 package org.gradle.example.simple;

我创建了一个简单的java“echo”应用程序,它接收用户的输入并向他们展示,以演示问题。我可以使用IntelliJ的内部“run”命令运行此应用程序,并且在执行由
gradle build
生成的编译后的java文件时也可以运行此应用程序。但是,如果我尝试使用
gradle run
执行应用程序,我会从扫描仪中抛出一个NoTouchElementException

我认为gradle或应用插件在系统IO上做了一些奇怪的事情

应用程序

package org.gradle.example.simple;

import java.util.Scanner;

public class HelloWorld {
  public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    String response = input.nextLine();
    System.out.println(response);
  }
}
build.gradle

apply plugin: 'java'
version '1.0-SNAPSHOT'

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'org.gradle.example.simple.HelloWorld'
    }
}

apply plugin: 'application'

mainClassName = "org.gradle.example.simple.HelloWorld"

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

您知道如何使用
gradle run

运行此应用程序吗?您必须将默认stdin连接到gradle,将其放入build.gradle:

run{
    standardInput = System.in
}

除了公认的答案之外:如果您使用的是而不是普通的Groovy DSL,那么您必须编写以下内容:

tasks {
    run {
        standardInput = System.`in`
    }
}


附加说明:我在Spring引导应用程序中遇到了类似的问题。在那里,我不得不修改
bootRun
任务,而不是
run
任务。

这非常有效,对于那些对现在出现的
gradle--console plain run
丑陋提示感到恼火的人来说,它将被删除。这有一个公开的问题,我在那里找到了这个代码段。如果不使用应用程序插件,则
standardInput=System.in
行应该位于您正在运行的任何需要stdin重定向到它的任务中。对我来说,它是在一个自定义任务中。老兄,它在我的运行脚本中不起作用。你能解释一下吗?你只是把这个片段放在build.gradle中,然后键入gradle run,你得到了什么错误?找不到参数[build\u 70djsz9uqda5dtwfrqrhv32tu$\u run]的run()方法_closure3@446452bb]在org.gradle.api.project类型的根项目上。