Ant の Java Task*1 でプログラムを起動させたときに、起動されたプログラムの標準入力に対して入力を与える方法を調べてみました。
結論から述べると、標準入力に渡したい内容のテキストファイルをあらかじめ用意しておき、<java classname="(クラス名)" input="(ファイル名)"> という感じで、input 属性にそのテキストファイルを渡してやると、その内容をプログラムに渡すことができます。
今回は ./input/ というディレクトリ以下に txt ファイルを作ることにより、それらを1つずつ渡して繰り返しプログラムを実行するための build.xml を作ってみました。for や if を使うためにANT Contrib を使っています。ant なんてもう過去の遺産みたいな感じですが、ちょっとしたことがやりたいときには maven とかよりも融通が利きやすいので便利なんですよね。
build.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><project name="hoge" default="run"><property name="mainclass"value="AppMain" /><property name="srcdir"value="./src" /><property name="destdir" value="./bin" /><taskdef resource="net/sf/antcontrib/antlib.xml"><classpath><pathelement location="/path/to/ant-contrib-1.0b3.jar" /></classpath></taskdef><path id="inputs"><fileset dir="./input" includes="*.txt"/></path><path id="classpath"><pathelement location="./bin"/></path><target name="init" /><target name="compile" depends="init"><delete dir="${destdir}" /><mkdir dir="${destdir}"/><javac srcdir="${srcdir}" destdir="${destdir}" includeAntRuntime="false"><compilerarg value="-Xlint:unchecked" /></javac></target><target name="run" depends="compile"><var name="done" value="0"/><for param="file"><path refid="inputs" /><sequential><echo>-----@{file}------</echo><java classname="${mainclass}" input="@{file}"><classpath><path refid="classpath"/></classpath></java><var name="done" value="1"/></sequential></for><if><equals arg1="${done}" arg2="0" /><then><java classname="${mainclass}"><classpath><path refid="classpath"/></classpath></java></then><else /></if></target></project>
実行結果はこんな感じになるはずです。
Buildfile: /path/to/build.xmlinit:compile: [delete] Deleting directory /path/to/bin [mkdir] Created dir: /path/to/bin [javac] Compiling 7 source files to /path/to/binrun: [echo] -----/path/to/input/1.txt------ [java] 1 [echo] -----/path/to/input/2.txt------ [java] 2 [echo] -----/path/to/input/3.txt------ [java] 3 [echo] -----/path/to/input/4.txt------ [java] 4BUILD SUCCESSFULTotal time: 753 milliseconds