Auto-update of native application bundles

Daniel Zwolenski zonski at googlemail.com
Tue Jun 19 18:59:08 PDT 2012


I've uploaded a new MSI to: http://zenjava.com/demo/update/testapp.msi

This is version 3 and it is blue. If you install and check for updates, you
will see that version 4 is available for download. If you upgrade you will
see that it's red. Note the upgrade is now quite quick as they both use the
same Java version.

This is now all in JavaFX instead of Swing. It is a nicer UI and user
experience but it is still very raw and would need a lot of work. It should
give you more of an idea though, and, of course, if anyone wants to look at
making it nicer please let me know.

*Note: If you have the older version you can auto update to this newer
version but because the whole point is to demonstrate the new auto-update
code, you would be better served by uninstalling, downloading the new one,
installing and then upgrading. *

I'm hoping (perhaps optimistically) for feedback on the two proposed
approaches from the community regarding "deltas assembled at compile time"
vs "deltas determined at runtime" (where a 'delta' is the same thing as a
'patch'). The floor is open, but if there isn't any feedback in the next
few days I will focus on just one approach - in the absence of any other
input it will likely be Igor's "deltas assembled at compile time" approach.
Speak now or forever hold your peace (or at least apologise later when you
make me change to another way).

Just to re-cap, here are the main pros/cons of each solution:

   - with *compile-time deltas* we can assemble all the changes into one,
   easy to deploy file (per delta/OS).
   - with *runtime deltas* the app has to be uploaded to the server
   unzipped (i.e. as it would appear on your local system) so the apps can
   work out diffs on the fly

   - with *compile-time deltas* you have to create and maintain all deltas
   you want to be available (e.g. v1-to-v2, v2-to-v3 and v1-to-v3). If you
   don't provide a delta, the system reverts to 'full' update (i.e. downloads
   everything). Currently this could mean a 50MB download (instead of say a
   4MB delta), but Igor has indicated this might be reduced considerably.
   Deltas also require some extra steps at compile time to define/detect what
   has changed.
   - with *runtime deltas* you only maintain/upload the latest code - the
   apps all work out the delta's on the fly and only download what they need
   (e.g. the 4MB of jars that have changed). You do not need to create or
   maintain any deltas. You do need to maintain an 'app-profile' but this
   could be mostly generated (easily from Maven, I imagine ant could automate
   it if you used versioned jars).

   - the single file of the *compile-time deltas* make life easier/quicker
   for signing.
   - with *runtime deltas* the tool has to sign every jar individually
   (although tooling would hide this - and signing requirements are not yet
   fully explored)

There are likely other smaller benefits as well (Igor, did I miss any big
ones?) but these major ones are what I would be weighing up.

There is another possible usage of *runtime deltas* that I've not brought
up before because I still can't decide if it is a positive or a negative.
With this approach the JARs don't have to come from the same URL source, so
for example you could download the third party JARs (like hibernate,
spring, etc) directly from centralised servers - and the Maven repos
provide exactly this already. This would be useful for corporate, intranet
style apps where they could maintain their own Maven repo, but for public
apps it might be a little risky? It also opens up lots of questions
regarding JAR signing, but I personally feel signing is not as necessary in
all cases as might be the current thinking (but that's probably another
debate).

Any and all feedback on all the above will be useful for determining a
solution.


More information about the openjfx-dev mailing list