Le_Coeur
Le_Coeur

Reputation: 1541

Ant run command with pipes

I must to implement command : java -jar test.jar page.xml | mysql -u user -p base in ant. So i Have tried with this task:

<java jar="test.jar" fork="true">
  <arg line="page.xml | mysql -u user -p base"/>
</java>

But i have got en exception with pipe - "|" :

 java.lang.IllegalArgumentException: Input already set; can't set to |

So, that's the problem:)

Upvotes: 26

Views: 18699

Answers (6)

trash80
trash80

Reputation: 157

Explaining why Amelie's answer is the correct solution:

The difference between Amelie's correct solution compared to Brain Agnew's solution is the subtle difference between them. Brian had the second arg as a "value" while Amelie is using "line".

Here's why Amelie's is correct, per Apache Ant Documentation:

  • "value | a single command-line argument; can contain space characters."

  • "line | a space-delimited list of command-line arguments."

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

Upvotes: 0

Brian Agnew
Brian Agnew

Reputation: 272367

The pipe (|) can only be used in a shell script. You're passing it as an argument to the java process.

So you need to execute a shell script. You can do this by executing (say) bash -c and passing the above as a shell statement (albeit inline - you could write a separate script file but it seems a bit of an overhead here)

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

Upvotes: 61

Bhushan Bhangale
Bhushan Bhangale

Reputation: 10987

There you are actually running a java command.

You need to use Exec task http://ant.apache.org/manual/Tasks/exec.html but not sure if there also you can run piped commands or not. Give it a try.

Upvotes: 0

Amelie
Amelie

Reputation:

I don't know if this was ever resolved, but I was having a similar problem which I solved by using the following:

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

Just thought I would share.

Upvotes: 12

Grzegorz Oledzki
Grzegorz Oledzki

Reputation: 24281

Another solution would be to wrap the java -jar test.jar page.xml | mysql -u user -p base into a separate script and call it with simple <exec> task.

Upvotes: 1

skaffman
skaffman

Reputation: 403591

When you run a java program from Ant, the input and out from the program are captured by the Ant runtime - you can't try and redirect them elsewhere using that pipe.

If you want to do that, you might have better luck with the exec task, although that might suffer from the same problem.

Upvotes: 0

Related Questions