Mi sono trovato nella situazione di dover rilasciare un’applicazione java stand-alone con un’interfaccia grafica realizzata usando le librerie SWING.
Il problema fondamentale, perchè non lo avevo mai affrontato prima, era rappresentato dai seguenti punti:

  • rendere la mia applicazione indipendente dalla versione di java installata sulla macchina client (java poteva anche non essere installato e ovviamente l’utente finale non era in grado di farlo da solo)
  • creare una procedura di installazione grafica da utilizzare in ambiente Windows,
  • Aggiungere sul desktop e nel menu avvio di Windows i link alla mia applicazione.

Vediamo quindi la soluzione che ho attuato.

Il launcher

Come sappiamo Java è indipendente dalla piattaforma e in teoria non dobbiamo preoccuparci di nulla se non di scrivere la nostra applicazione. Dovendo però rilasciare un’applicazione con una procedura di installazione embedded tipo windows installer, doppio click sull’icona e via con l’installazione, il problema diventa:

  • Java è installato sulla macchina?
  • Se no, l’utente è in grado di scaricarlo dalla rete e installarlo autonomamente?
  • Se si, la versione di Java è compatibile con il nostro software?

In teoria potrei generare un jar autoestraente ma i punti sopra esposti rimangono ancora.

Preso quindi atto che il problema esiste, ho fatto un pò di software selection in giro per la rete tra le varie soluzioni open source a costo zero e mi sono orientato su Launch4j (http://launch4j.sourceforge.net/).
Questo launcher è molto semplice da usare e consente di includere una versione embedded di Java da usare nel caso in cui il sistema ospitante rientri in uno dei due casi descritti in precedenza. Il prezzo da pagare è ovviamente il peso dell’applicazione che deve portarsi dietro quasi 200 Mb di librerie java.
Possiamo poi associare un’icona alla nostra applicazione e definire altre utili proprietà utilizzando l’interfaccia GUI o modificando direttamente un semplice file XML di configurazione.
Una volta terminata la configurazione e lanciato il processo, launch4j crea per noi un un bel file eseguibile e il gioco è fatto.

L’installer

Per la parte relativa all’installer devo dire che non mi hanno entusiasmato molto le soluzioni open che ho trovato in giro (quantomeno quelle gratuite) quindi mi sono dato da fare realizzando alcune semplici classi e interfacce per pilotare delle finestre SWING e ho realizzato da zero una semplice interfaccia GUI di installazione.
Se ci pensate bene, occorre solo gestire l’inserimento del path di installazione e poche altre cose quindi tutto sommato non era complicato e alla fine ho anche rispolverato un pò di programmazione SWING.

  • Ho realizzato un’interfaccia ApplicationInstaller contenente tutte le label da gestire trasvesalmente durante l’installazione.
  • Ho realizzato un’interfaccia InstallationStep che agisce su uno StepPanel (JPanel), il singolo passo di installazione.
  • Ho realizzato un’interfaccia InstallationStepAction per controllare le eventuali azioni scatenate dal singolo passo di installazione. Questa interfaccia non è altro che l’implementazione di un pattern command quindi le classi concrete che la implementano vanno ad agire su un metodo executeStepAction che interagisce con i componenti grafici presenti nello specifico StepPanel qualora sia richiesto lanciare una qualche azione o recuperare i dati inseriti dall’utente.
  • La classe principale del mio Installer non fa altro che implementare l’interfaccia ApplicationInstaller e utilizzare un vettore di InstallationStep per intercettare le operazioni scelte dall’utente e lanciare eventualmente le InstallationStepAction.

Mi rendo conto che questa traccia è un pò semplicistica, ma lo scopo finale non è quello di scrivere un tutorial su come realizzare un’installer.

Interagire con Windows

Per la parte relativa all’interazione con il desktop e il menu avvio di Windows ho utilizzato le librerie JShortcut (http://alumnus.caltech.edu/~jimmc/jshortcut/).
A patto di includere all’interno della nostra applicazione il jar jshortcut e la relativa DLL per Windows il gioco è fatto:

public void makeDesktopShortcut() {
String exeFileName = NOME_FILE_EXE;
JShellLink link = new JShellLink();
String dir = JShellLink.getDirectory(“desktop”);
link.setFolder(dir);
link.setName(ApplicationInstaller.APP_NAME);
link.setPath(exeFileName);
link.save();    
}

public void makeStartMenuFolder() {
String smDir = JShellLink.getDirectory(“programs”) + ApplicationInstaller.INSTALL_DIR;

File myStartDir = new File(smDir);
if(myStartDir.mkdir()) {
JShellLink link = new JShellLink();
    link.setFolder(smDir);
    String exeFileName = NOME_FILE_EXE;        
    link.setName(ApplicationInstaller.FOLDER_NAME);
    link.setPath(exeFileName);
    link.save();
}
}

I due metodi esposti sono semplificati al netto dei blocchi try/catch per le eccezioni.
Il mio timore è che con l’evoluzione delle versioni di Windows queste librerie non siano più utilizzabili. Al momento però fanno bene e facilmente il loro lavoro.

A questo punto, l’installazione è terminata e il nostro utente, non tecnico, potrà avviarla semplicemente facendo doppio click sull’icona del desktop o lanciando il programma dal menu avvio.

Spero di aver indirizzato altri con lo stesso problema nella giusta direzione.

Stay tuned.