Ant使用管道运行命令

26
我将要实现以下命令:java -jar test.jar page.xml | mysql -u user -p base,并将其用于ant中。因此,我已经尝试使用以下任务:
<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个回答

61

管道符(|)只能在shell脚本中使用,你将它作为java进程的参数传递了。

所以你需要执行一个shell脚本。你可以通过执行(比如)bash -c命令,并将上述内容作为shell语句传递(尽管是内联的形式——你也可以编写单独的脚本文件,但在这里似乎有点过度)。

  <exec executable="bash">
    <arg value="-c"/>
    <arg line="java -jar test.jar page.xml | mysql -u user -p base"/>
  </exec>

1
哇,我以为它能运行,但是不行了... 我得到的是: 没有这个文件或目录。 - Le_Coeur
从哪里开始?你可能需要设置你的类路径(或类似的 - 不要忘记你现在正在产生一个独立的进程)。 - Brian Agnew
5
问题出在 <arg value="...">,应该改为 <arg line="...">。但现在显示:/usr/bin/java: /usr/bin/java: 无法执行二进制文件。 - Le_Coeur
是的,<arg value="-b"/> 对我不起作用,但是 <arg value="-c"/> 可以。当然,我正在执行一个除 Java 之外的二进制文件,但仍在使用管道。 - Quinn Taylor

11

我不知道这个问题是否已经解决,但我曾经遇到过类似的问题,并通过以下方式解决:

<exec executable="bash">
    <arg value="-c"/>
    <arg line='"java -jar test.jar page.xml | mysql -u user -p base"'/>
</exec>

只是想分享一下。


1
另一个解决方案是将 java -jar test.jar page.xml | mysql -u user -p base 包装到一个单独的脚本中,并使用简单的 <exec> 任务调用它。

0

解释为什么Amelie的答案是正确的解决方案:

Amelie的正确解决方案与Brain Agnew的解决方案之间的微妙差别。 Brian将第二个参数作为“值”而Amelie使用“行”。

这就是为什么Amelie的答案是正确的,根据Apache Ant文档

  • "value | 单个命令行参数;可以包含空格字符。"

  • "line | 用空格分隔的命令行参数列表。"

<exec executable="bash">
    <arg value="-c"/>
    <arg line='"java -jar test.jar page.xml | mysql -u user -p base"'/>
</exec>


0
当您从Ant运行Java程序时,程序的输入和输出会被Ant运行时捕获 - 您不能尝试使用该管道将它们重定向到其他位置。
如果您想这样做,您可能会在exec任务中有更好的运气,尽管那也可能遇到同样的问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接