Well, I believe you can use .jnlp for this. That should work for most cases.
Another approach that I took is on startup:
Get an MD5 of all files and store it in a file:
http://www.twmacinta.com/myjava/fast_md5.php
Download a list of current MD5s from http (generated by a script)
Compare the local list with the remote list.
If anything is missing or md5 is different than download compressed file via http.
If anything is on local list but not in remote list (and not in 'mod' or user directory) then delete it.
I used 7zip for compression:
http://www.7-zip.org/sdk.html
I used http because it was simple and fast and took load from the game server.
The benefits of this are:
1) It only downloads changed/missing files
2) It's fast
3) uses standard/open libraries and http server (which is cheap bandwidth compared to a "game server")
4) It's easy to thread out if you want to make it faster
5) The only thing the player needs is the startup/launcher program. From there it can keep it's self up to date.
The downside:
1) During an update, your http is going to get slammed.
2) .jnlp already has most of this functionality built in.
To get around slamming your http server, you could have a 'pre-release' directory that has the files and then download them in a throttled and controlled manner days or weeks before the real release.. Then at release time, check the pre-release directory first (before downloading via http).