I am writing an application in Java for the desktop using the Eclipse SWT library for GUI rendering. I think SWT helps Java get over the biggest hurdle for acceptance on the desktop: namely providing a Java application with a consistent, responsive interface that looks like that belonging to any other app on your desktop. However, I feel that packaging an application is still an issue.
OS X natively provides an easy mechanism for wrapping Java apps in native application bundles, but producing an app for Windows/Linux that doesn't require the user to run an ugly batch file or click on a .jar is still a hassle. Possibly that's not such an issue on Linux, where the user is likely to be a little more tech-savvy, but on Windows I'd like to have a regular .exe for him/her to run.
Has anyone had any experience with any of the .exe generation tools for Java that are out there? I've tried JSmooth but had various issues with it. Is there a better solution before I crack out Visual Studio and roll my own?
Edit: I should perhaps mention that I am unable to spend a lot of money on a commercial solution.
Consider converting your application to Eclipse RCP. It is written in SWT, and the Eclipse IDE contains packaging tools that generate executables for all major platforms. For windows, it can generate a zip or a folder containing your code. For a common installation experience, I'd using NSIS. There is actually a packages generator project at eclipse to create common installers for all platforms eclipse supports.
Have you considered Advanced Installer?
I have used it severally especially for Windows and Mac. No scripting or Ant required. All GUI. Very simple and understandable. Ain't free but worth every penny.
- Lauch as Administrator
- File Association
- Custom Install Themes + In built Themes
- Package with JRE
- Install location
- Native Splash screen implementation
- You can event create services and installation events
- Prerequisites
- JRE minimum version and maximum version
And a lot more. And don't get it twisted, i have no connections with the dudes...their App is just awesome.
To follow up on pauxu's answer, I'm using launch4j and NSIS on a project of mine and thought it would be helpful to show just how I'm using them. Here's what I'm doing for Windows. BTW, I'm creating .app and .dmg for Mac, but haven't figured out what to do for Linux yet.
Project Copies of launch4j and NSIS
In my project I have a "vendor" directory and underneath it I have a directory for "launch4j" and "nsis". Within each is a copy of the install for each application. I find it easier to have a copy local to the project rather than forcing others to install both products and set up some kind of environment variable to point to each.
Script Files
I also have a "scripts" directory in my project that holds various configuration/script files for my project. First there is the launch4j.xml file:
And then there's the NSIS script rpgam-setup.nsis. It can take a VERSION argument to help name the file.
Ant Integration
I have some targets in my Ant buildfile (build.xml) to handle the above. First I tel Ant to import launch4j's Ant tasks:
I then have a simple target for creating the wrapper executable:
And another target for making the installer:
The top portion of that just copies the necessary files for the installer to a temporary location and the second half executes the script that uses all of it to make the installer.
Have you thought about Java Web Start? Here is a tutorial specifically for deploying an SWT application with Java Web Start.
You can now do this through Netbeans! It's really easy and works perfectly. Check out this tutorial on the Netbeans website.
In my company we use launch4J and NSIS for the windows distribution, and jdeb for the Debian distribution, and Java Web Start for the general operating system. This works quite fine.