Here's one situation I saw. I have a gradle build that builds both a debug and release signed jar that is created by using jarsigner. The debug jar was signed by the default "debug.keystore" provided by android studio and the release jar was signed by my private keystore. For practical purposes the two jars are pretty much identical. Both contained the identical META-INF/MANIFEST.MF entry. The jarsigner for the debug jar overwrote the MANIFEST.MF entry. It only contained the signing entries. On the other hand, the jarsigner for the release jar appended the signing entries to the end of the existing MANIFEST.MF file as expected. Just for fun, I made a copy of the "debug.keystore" and renamed it and tried using it instead for the keystore. The manifest file was still overwritten. I then made a private keystore and created it with the same keyalias, cn, o, ou, as contained in the debug.keystore. This time the manifest file was appended to rather than being overwritten. That seems to imply that there is something related to the keystore itself that determines whether the MANIFEST.MF file is overwritten or not. Weird, but that's what I observed.
With some further investigation I discovered that my original MANIFEST.MF file did not contain a "Manifest-Version" header entry. So I added the entry and tried things again signing the debug jar with the original "debug.keystore". This time both jars appended the signing entries to the end of the existing MANIFEST.MF file rather than the debug jar overriding the MANIFEST.MF file. From that observation, we can all say, that makes sense; but who would have thought that. I certainly could not find that behavior documented anywhere.