Gradle运行任务在控制台中接受输入,但不作为IDEA运行配置。

7

我有以下的Java主类,我正在尝试使用IntelliJ IDEA中的Gradle插件编译和运行:

package com.mikidep.bookshop;

import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        System.out.print("Inserisci testo qui: ");
        System.out.println(in.nextLine());
        System.out.println("Yee!");
    }
}

以下是我的 build.gradle 内容:

group 'com.mikidep.bookshop'
version '1.0-SNAPSHOT'

apply plugin: 'application'

mainClassName = "com.mikidep.bookshop.Main"

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

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

run {
    standardInput = System.in
}

现在,如果我在终端中运行gradle run -q,一切都按预期工作。但是,我想使用这个IDEA运行配置来进行测试运行:IDEA Run configuration 在没有控制台输入时,一切都很好。in.nextLine()会抛出以下异常:

Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Scanner.java:1585) at com.mikidep.bookshop.Main.main(Main.java:10)

我也尝试了调试,并注意到System.in中的所有字段似乎都被清零,就像整个流没有被初始化一样。有人知道发生了什么吗?编辑:我刚刚验证了这也影响构建脚本:我将这些行添加到运行任务中
System.out.println("Wait...")
System.in.read()
System.out.println("Ok!")

但是Gradle会立刻打印出这两行,而不等待我的输入。

可能是这个问题的重复:在IntelliJ IDEA和Gradle上进行调试时等待用户输入 - lukeg
1个回答

2

System.in不是脚本参数。

在命令行中,如果您没有指定Gradle所需的任何参数,它将使用您输入的剩余内容作为标准输入。在IDEA中,标准输入和脚本参数是分开的,标准输入来自运行或调试控制台窗口。


我知道,“-q”只是为了防止gradle输出混乱控制台。当我在某个终端中运行它时,我输入一些易于识别的文本,然后像我期望的那样将其抛回。如果我在IDEA中运行它,程序甚至不等待输入,它只会抛出异常并终止。 - Michele De Pascalis
它应该等待输入,所以我认为这是IDEA中的一个错误。 - JBaruch
我还在问题中添加了一些信息。 - Michele De Pascalis

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