Is there a standard way to deploy a Java application?
I've been thinking about this a bit recently and a comment on the javaposse google group tipped me into blogging mode. While discussing the recent shipping of JDK 6u10 Reinier Zwitserloot said On windows, and on linux, there is no java at all. It has to be installed separately. This is supremely annoying. There are odds the linux user has e.g. debian/ubuntu openjdk-6 installed, and on windows there's a chance that the manufacturer has shipped an auto-updating JDK out of the box, but there's no certainty there. On macs, at least, you know there's always a java, and a well integrated, if non-standard, way to deploy. ... outside the obvious statement of it would be nice for Java to be there in the operating system so it can be an assumed part of the infrastructure (thanks to OpenJDK we're moving in that direction for free OS's) this thought that there is a 'standard' way to deploy a Java app strikes me as being a little odd.
On Windows applications usually deploy as a .exe which hopefully doesn't contain a virus and which you run an installer which weaves registry entries and drops .DLL's into the DLL Hole and so on ..
On Linux you have several packaging paradigms, from .tar.gz to .rpm to .deb .. The Linux distros have varying policies for packaging Java app's and dropping them on the file system. And while there is a long standing issue about whether the Java VM implementations are LSB compliant at least with OpenJDK the distros can take care that the VM is installed correctly on the OS.
On Solaris is a similar problem but the package format is different.
On Mac there's several ways to install an app, usually a .dmg and you drag a .app to /Applications. It's real simple. For Java the installation of the Java VM is more than a little screwy but there is a JDK style directory tree buried somewhere under /System/Library/Frameworks
My point here is there doesn't seem to be any standard way to deploy a Java app (and have it properly integrated with the OS) .. and that it the root cause is outside the hands of the Java ecosystem to resolve. The root cause is that the OS vendors do not have a universal application delivery mechanism. The OS vendors all have their own ideas of how best to package and install and deploy applications.
For most cases a Java app can be deployed as a .jar (depending on the requirements of external dependencies) and running the app is done with "java -jar file.jar" or in some cases you can double click it's desktop icon. Maybe this is the 'standard way to deploy a Java app' ?? If so this way to deploy is not nicely integratable with the OS preferred way to deploy applications.
With 6u10 we have this idea of deploying a Java app via a packaged JNLP which you drag onto the desktop. That may improve the deployment of applications for some cases.