Using Process Monitor, I added a filter to check for the target .exe and found that it was failing to load cygwin1.dll:

The problem is that Runtime.exec(String[], String[]) does not copy over any existing environment variables, whereas Runtime.exec(String[]) does. You therefore have to copy existing environment variables yourself: