带管道的Ant运行命令

时间:2009-07-27 10:11:14

标签: java ant

我必须实现命令: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 |

所以,这就是问题:)

6 个答案:

答案 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>