標準入力が受けれない
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: