While restarting a native app (like Firefox) is probably necessary to pick up updates, in
Java you can avoid this using OSGi. Unloading parts of an app during runtime (in the shape of jar files called "bundles"), and replacing them with newer versions is one of the fundamental use cases for OSGi. The name of the jar file wouldn't be relevant, so nothing would get overwritten.
If I wanted to do this without resorting to OSGi, I'd check out if Runtime.exec or ProcessBuilder can start subprocesses that continue to run if the parent process is terminated. But OSGi would definitely be my first choice.