The problem turned out to be unpack200. During unpacking, it creates a zip file. Initializing the ZipEntries requires the time libraries (due to setTime()), which in turn means lib/zi has to be present.
The fix was to delegate all unpacking to unpack200.exe, rather than the Java unpack200 APIs. We tried to be a bit smarter and only delegate to the exe until all code required for the Java unpacker was present, but it turned out to be very complex and error prone, so for the time being we are going with the simple and safe solution.