I spent quite some time to look at this problem. I tested the JDK's behavior and agree with David that the spec and RI together didn't do a good job to explain the indication of "useCaches=false". Currently SUN JDK also returns the same JarFile instance if "getJarFile()" is called upon the same JarURLConnection whose "useCaches" is set false. This behavior is not faithfully following the spec...
Anyway I created a patch and attached to the JIRA. It should apply to both the 2.1 and 2.2 branches. I didn't take care of NestedJarFile & UnpackedJarFile as I suppose they are not used by JarFileUrlConnection - I did a little experiment, adding a hook in the JarFileUrlConnection to check the type of JarFiles that are passed in. I started the server and deploy an ear, and didn't see instances of NestedJarFile & UnpackedJarFile passed into JarFileConnection. But I could miss something...
I did open a jira entry GERONIMO-4671.
It seems that many class must be modified to fix this bug, so I'm
sorry I cannot fix.
At present, I temporarily solve by modifying my program.