Runtime.exec is the way of doing this in Java. Any other library would likely be platform specific. You'd need a very good reason not to use Runtime.exec.
I've currently got several programs that make use of this feature and it hasn't caused any trouble.
With Runtime.exec you can optionally block while waiting for the call to complete. You can capture return codes and anything the command line program writes to the console. And I'm sure there are many other features, those are just the ones that were useful to me.
And you can always have it invoke an ant task if you really want to use ant! :)