That change to exec() doesn't break anything does it?
No, it's fine. The only other caller is the VersionInfoMojo. I chose to do the Exec change in a way that would be backward-compatible for VersionInfoMojo. It's a new overload of the run method that captures stderr in a separate in/out variable. Only ProtocMojo calls the new overload. VersionInfoMojo still calls the old one.
An alternative would have been just to dump both stdout and stderr into the same in/out variable used by the existing run method. That could have been dangerous, because VersionInfoMojo has specific expectations about the output, and dumping stderr on top of that could have harmed that logic.
Thanks for the review. I'll commit later today.