蚂蚁在运行java类时从std中读取时挂起
问题描述:
我有一个从std中读取的java类。当我使用java任务从ant运行这个类时ANT只是挂起并且不显示我的提示输入,也没有它接受来自命令行的输入。它只是挂在那里。如果我使用shell脚本运行相同的类,它将起作用。蚂蚁在运行java类时从std中读取时挂起
有谁知道ANT为什么这么做?我试着将fork(在java任务上)设置为true和false。两人都没有工作。
答
Ant正在执行一些System.in和System.out拦截(观察从自定义任务中执行System.out.println()时会发生什么),但您可以通过使用输入任务
http://ant.apache.org/manual/Tasks/input.html
例如,你可以有一个任务叫下面的代码
public class AccountSettings extends Task {
private String guid;
public AccountSettings() {
super();
guid = null;
}
public void execute() throws BuildException {
if(guid != null) {
//Do something with guid
} else {
throw new BuildException("guid not defined!");
}
}
public void setGuid(String value) {
guid = value;
}
}
,然后让“GUID”值通过输入任务设定下列位AccountSettings xml
<taskdef name="settings" classname="AccountSettings"/>
<input message="Enter an account guid" addproperty="ACCOUNT.GUID"/>
<settings guid="${ACCOUNT.GUID}"/>
答
你能分享你的代码,因为我只是尝试了这个example,使用这种简单的的build.xml和它的工作对我来说:
<project default="run">
<target name="run">
<java classpath="." classname="ReadString"/>
</target>
</project>
输出是丑陋,但有效。
答
如果(如@Jason Sperske所说)Ant截取(替换)System。*流,则另一种方法是修改Java类以使用java.io.Console
类读取和写入控制台。但是,请注意,这将避免(例如)从命令shell运行Ant时可能执行的标准流的任何重定向。