Application installers are a critical piece of many software distribution efforts, particularly for
Java desktop applications. The installer is the first part of the application the customer
sees. If the installer does not work correctly end users will often give up and refuse to try to
troubleshoot the issue. It is thus critical that installation is as painless as possible.
Java Web Start: The default choice
The default choice for installation of Java applications is often
Java Web Start. Java Web Start provides
the ability to download and launch applications from a web page, and to download and install the correct
Java Runtime Environment (JRE) if needed. Once an application has been downloaded it can run
offline from a cached version. Java Web Start can also download updated versions of the application
jar files, thus fulfilling the roles of installer and
automatic updater. Java Web Start is
based on, and is an implementation of, the Java Network Launching Protocol (JNLP). Web Start is,
of course, produced and supported by Sun Microsystems and is free.
Despite the advantages of Java Web Start it is not the only installer option. In fact, it is
technically not an installer at all, as indicated in this passage from the
JNLP Specification version 6.0:
1.1 Web-centric Application Model
A JNLP Client is an application or service that can launch applications on a client system from
resources hosted across the network. It is not a general installation protocol for software
In other words, Java Web Start is a network application launcher rather than a full application
installer. Java Web Start has several advantages and is the best choice for many applications, but
there are some trade-offs. The issues with Web Start fall into three main categories:
- Installation of Web Start itself, and the right JRE, is sometimes problematic. This very much
depends on who your users are.
- Web Start is not designed to handle the 'permanent' installation of files or native components
onto a person's machine. Instead it's designed to pull such elements from the
internet and cache them on disk. You lose some control of installation
location this way, as well as the ability to register subcomponents with the OS and provide
conventional uninstallation procedures.
- Web Start launches your application in a generic Java process, rather than naming the process
after your application.
Sun has been working hard to solve these issues, particularly the first one. The difficultly lies
with users who do not have a JRE installed on their computer. In this case they do not have Java
Web Start installed either, so clicking on a JNLP link does not work. Web pages hosting Web Start
user to understand the problem be directed to Sun's site to download a JRE. This is a separate,
large download requiring the user to agree to a separate license agreement. In other words, it's a
barrier to getting your application running that some users may not cross.
Things are improving. Java Web Start is included in all JREs since version 1.4. Java is standard
on Mac OS X, is included with most distributions of Linux, and is now included with most new
machines that have Windows pre-installed. Recent estimates state that Java is present on 90% of all
desktop machines. Sun also has several initiatives to ease the installation process including a
used), a simpler licensing agreement dialog, and a smaller initial download size for the JRE. These
welcome initiatives are moving in the right direction, but some will not be released until early
2008, and they will take time to diffuse out into the desktop ecosystem. In the meantime application
developers must weight the pros and cons of Java Web Start vs. a more conventional application
installation. For Java applications to compete against native desktop applications it is important
not to assume that Java must be presented in some completely platform-native way and cannot use a
conventional application installer. Of course, it is possible to have multiple ways to use an
application available from the same site, including a Java Web Start launching button and an option
to download and run a conventional installer. This way users can choose the technique that works
Despite the issues with Java Web Start, it has the built-in capability to automatically
update your application using either timestamps or version numbers. Auto-updating is an important
function, and with Web Start this is built-in and free.
Toolsets for deployment: Launchers, Installers, & Installer Generators
Let's clarify our terminology for the numerous tools available:
- Launcher: A wrapper around a JAR file that launches a
process and runs the Java application within that process.
- Installer: A program that writes a Java application
and all files needed to run it (including a launcher) to disk, and performs any OS
configuration desired (such as creating desktop icons).
- Installer Generator: Creates native installation
programs (and native launchers) for multiple platforms.
If your application runs in it's own
process (such as a standard desktop application) then a launcher provides several benefits. It can
check the JRE version to ensure there are no version conflicts before launching the Java application
within the JRE. It can also use native code to rapidly present a splash screen before the JRE loads,
though as of Java 1.6 this is also a built-in feature of the JRE.
One of the most important benefits of a launcher is the ability to register itself as a standard
application within the operating system
(OS) so the OS grant special permissions to your application, rather than to the Java runtime. It
can name the OS process after your application, and register your company as the publisher of the
application. This means users can identify the process running your application as yours, rather
than seeing multiple generic "java" processes running on their computer. This is especially important
when the OS gives security warnings related to the application, or if the user needs to find the
application process in the the process list (task list in Windows). Obviously, if your application
needs special permissions to run and the user becomes confused about which application is making
the request they will probably deny the request, preventing your application from operating
There are many programs that can generate a native launcher for your Java application. However,
most installer generators (see below) will also create a launcher. Buying a separate launcher
generator is not usually necessary.
An installer is optional. The alternative is to simply provide all files as a compressed or
self-extracting file and let the user unpack it in their directory of choice. This works well for
software developers but is not suitable for many consumer-level applications. Installers provide
a number of features beyond simply extracting the program files:
Interestingly, Java Web Start provides the first two of these features, but not the rest.
- Detect installed JREs to ensure the proper JRE is present, and download and install it if
- Create desktop icons and OS-level menu items for launching the program.
- Register the program and its uninstaller with the OS.
- Allow the user to configure the installation directories.
- Require the user to agree to a license agreement.
- Give the user multiple configuration options (such as languages, minimal vs. full install, etc.).
- Write configuration data to the user directory, registry, etc.
- Run aribitrary scripts during installation.
- Install a program as a service.
There are a number of installer programs written in Java. That is, the installer itself is a Java
program. This creates an obvious problem: if the user does not have Java on their machine they
cannot run the installer. This is the classic "install the installer" problem, and it is the reason
why the installation program the user downloads should be written in native code for their platform.
The installer can then detect the user's JRE and download and install a correct JRE before launching
your Java application. Java Web Start suffers from the install the installer problem. The way to
create a native installation program for every platform is to use an installer generator.
An installer generator is an application that creates an installer for your software product. The
best installer generators will create a native launcher and a native installer for every major
platform. They should also be easy to integrate into your build process, usually by providing an
Ant task or Maven Mojo. Once configured, you should be able to run a build that compiles and
packages your Java application and then creates a native installer for every major platform. This
should happen automatically on a full build with no manual intervention required. Some installer
generators even create a web page for you to help you distribute the correct installer to each
A critical point to note is that, unlike Java Web Start, most installer genertors do not provide
automatic updating out-of-the-box. Instead it must be added using an additional tool and, quite
often, custom programming.
Java Web Start Info and Documentation
Java Web Start official site
Java Web Start Wikipedia entry
Java Web Start Guide
Java Web Start FAQ
Excellent examples of how to use Web Start features at PhySci
Java Web Start Controversies
Keith Lea Blog Entry
Kyle Cordes Blog Entry
Diego Doval Blog Entry (see Thomas Ng's extensive response in the comments).
Roedy Green's Mindprod entry on installing and repairing Java Web Start
Open-source Launchers & Installers
List of open-source installer generators at java-source.net
Commercial Installer Generators
Advanced Installer by Caphyon
Install4J by ej-technologies
InstallAnywhere by Macrovision
JExpress by DeNovo
JNLPWrapper by Duck Creek Software
MakeInstall by Duckware
One final note: we do not advocate using any particular technology. Rather, we prefer to put all of
the available options on the table for you to evaluate. Enjoy.