Gradle JavaExecのTaskで標準入力をあつかう

標準入力が受けれない

GradleのJavaExecタスクで動かしたい場合、
実行プログラム側では、標準入力が取得できないようです。

実行プログラムは例えばこんな感じで、標準入力を一行づつ出力するようなものです。
e.g.) sample.groovy

System.in.eachLine { line, num ->
    println "$num: $line"
}

Task type:JavaExec

タスク実行時に、標準入力を引き渡しておく必要があります。
JavaExecというよりは、Execタイプの扱いって感じみたいですね。
https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html#org.gradle.api.tasks.Exec:standardInput

build.gradle のJavaExecタスクに、standardInput = System.in というものを追記しましょう。
ExecタイプのタスクではstandardInputがデフォルト  nullとなっているため、標準入力が受け取れないようです。

前回紹介した、任意のメインクラスを指定して実行するタスクを以下のような形にしてみました。
-Pstdin という感じで使うと、standardInput = System.inと設定するようにしています。

task launch(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath

    doFirst {
        if (!project.hasProperty("main")) {
            throw new IllegalArgumentException("""
                | usage:
                |         ./gradlew $name -Pmain=<ClassName>
                """.stripMargin())
        }

        if (project.hasProperty("stdin")) {
            standardInput = System.in
        }

        systemProperties = System.properties as Map
        main = project.main
    }
}

標準入力を受け取る

先程のGradleタスクを実行してみます。
echo をパイプで繋いで、標準入力として渡してみましょう。

echo "
hoge
piyo
foo
" | ./gradlew launch -Pmain=sample -Pstdin

-Pstdin というオプションをつける事で、standardInput = System.in が実行されてます。

出力結果は、こんな感じですね。

1: 
2: hoge
3: piyo
4: foo
5: 

コメントを残す