我必须实现命令:java -jar test.jar page.xml | mysql -u user -p base
在蚂蚁。所以我尝试过这个任务:
<java jar="test.jar" fork="true">
<arg line="page.xml | mysql -u user -p base"/>
</java>
但我的管道异常 - “|” :
java.lang.IllegalArgumentException: Input already set; can't set to |
所以,这就是问题:)
答案 0 :(得分:59)
管道(|)只能在shell脚本中使用。你将它作为java进程的参数传递。
所以你需要执行一个shell脚本。您可以通过执行(例如)bash -c
并将上面的内容作为shell语句传递(虽然 inline - 您可以编写一个单独的脚本文件但这看起来有点开销)。
<exec executable="bash">
<arg value="-c"/>
<arg value="java -jar test.jar page.xml | mysql -u user -p base"/>
</exec>
答案 1 :(得分:7)
我不知道这是否曾经解决过,但是我遇到了类似的问题,我使用以下方法解决了这个问题:
<exec executable="bash">
<arg value="-c"/>
<arg line='"java -jar test.jar page.xml | mysql -u user -p base"'/>
</exec>
想到我会分享。
答案 2 :(得分:1)
另一个解决方案是将java -jar test.jar page.xml | mysql -u user -p base
包装到一个单独的脚本中,并使用简单的<exec>
任务调用它。
答案 3 :(得分:0)
当您从Ant运行java程序时,Ant运行时会捕获程序的输入和输出 - 您无法尝试使用该管道将它们重定向到其他位置。
如果你想这样做,你可能会更好地使用exec
任务,尽管这可能会遇到同样的问题。
答案 4 :(得分:0)
你实际上在运行java命令。
您需要使用Exec任务http://ant.apache.org/manual/Tasks/exec.html,但不确定是否还可以运行管道命令。试一试。
答案 5 :(得分:0)
解释为什么Amilie的答案是正确的解决方案:
Amilie的正确解决方案与Brain Agnew的解决方案之间的区别是它们之间的细微差别。在Amilie使用“线”时,Brian将第二个arg作为“值”。
根据Apache Ant Documentation,这就是Amilie正确的原因:
“ value |一个命令行参数;可以包含空格字符。”
“行|命令行参数的空格分隔列表。”
<exec executable="bash">
<arg value="-c"/>
<arg line='"java -jar test.jar page.xml | mysql -u user -p base"'/>
</exec>