java.util.scanner 在应用程序启动时抛出 NoSuchElementException

我创建了一个简单的java“echo”应用程序,该应用程序接受用户的输入并将其显示给他们以演示问题。我可以使用IntelliJ的内部“run”命令毫无困难地运行此应用程序,并且在执行由生成的编译Java文件时也是如此。但是,如果我尝试使用 执行应用程序,我会从扫描程序中抛出一个 NoSuchElementException。gradle buildgradle run

我认为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


答案 1

您必须将默认的 stdin 连接到 gradle,将其放在 build.gradle 中:

run {
    standardInput = System.in
}

最后更新: 2021年9月9日

正如评论中所建议的那样,使用选项运行,以避免所有那些嘈杂和恼人的提示nickbdyergradlew run--console plain

gradlew --console plain run

如果您还想完全摆脱所有gradle任务日志,请添加选项-q

gradlew -q --console plain run

答案 2

除了接受的答案之外:如果您使用的是Gradle Kotlin DSL而不是正常的Groovy DSL,则必须编写以下内容:

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

附加说明:我在Spring Boot应用程序中遇到了类似的问题。在那里,我必须修改任务而不是任务。bootRunrun


推荐