martedì 26 agosto 2014

Creare eseguibili Windows con Java

Vai all'indice

Una delle necessità apparentemente banali, ma che possono avere una soluzione non immediata, è la creazione di programmi java eseguibili da un pc Windows.
La prima cosa da fare è aprire Eclipse e creare un nuovo Java project (File>New>Java project). All'interno della cartella src creo un pacchetto "prova" nel quale definisco il file Main.java e inserisco il codice:


package prova;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


public class prova {

   private static StringBuilder oString = new StringBuilder(""); 
   

   public static void main(String[] args) {

       long start=System.currentTimeMillis();
       testString();
       long end=System.currentTimeMillis();
       oString.append("Tempo di esecuzione testString() "+(end-start)+" millis.\n");
       
       start=System.currentTimeMillis();
       testStringBuffer();
       end=System.currentTimeMillis();
       oString.append("Tempo di esecuzione testStringBuffer() "+(end-start)+" millis.\n");
       
       start=System.currentTimeMillis();
       testStringBuilder();
       end=System.currentTimeMillis();
       oString.append("Tempo di esecuzione testStringBuilder() "+(end-start)+" millis.\n");
  
       File file = new File("output.txt");
        try {
           FileWriter fw = new FileWriter(file);
           fw.write(oString.toString());
           fw.flush();
           fw.close();
        } catch (IOException e) {                        
           System.out.println(e);         
        }         
    }            

        private static void testString() {
          String x = "";
          for(int i=0;i<15000;i++){
            //operazione di append
            x+=i;
          }
        }
        
        private static void testStringBuffer() {
          StringBuffer x = new StringBuffer("");
          for(int i=0;i<15000;i++){
            //operazione di append
            x.append(i);
          }
        }
        
        private static void testStringBuilder() {
          StringBuilder x = new StringBuilder("");
          for(int i=0;i<15000;i++){
            //operazione di append
            x.append(i);
          }
        }        




   }



L'obiettivo è creare un eseguibile java, quindi è indifferente il codice da utilizzare nella classe Main. Ne approfitto per introdurre le classi StringBuilder e StringBuffer, molto utili per gestire stringhe di caratteri. Esse ereditano le caratteristiche dalla classe madre String, ma sono più performanti e permettono operazioni sulle stringhe più veloci e meno onerose in termini di utilizzo della memoria. L'unica classe Main del progetto definisce ed esegue tre metodi che ciclando su tre oggetti delle classi String, StringBuilder e StringBuffer ne mostrano le performance. Il risultato è salvato in un oggetto StringBuilder e scritto nel file di testo output.txt.

Per salvare il progetto come Jar eseguibile è sufficiente cliccare col tasto destro sull'icona di progetto nella finestra dei progetti, selezionare l'opzione Runnable Jar file e seguire la procedura guidata, inserendo il nome del progetto ed il path di destinazione come descrive l'immagine.



A questo punto il file Jar ottenuto può essere eseguito in diversi modi: da linea comando o tramite script .bat su Windows o .sh su Linux.
Io ho preferito incorporare l'archivio Jar in un file .exe utilizzando Launch4j, un programma scaricabile dal sito http://launch4j.sourceforge.net .
Launch4J è uno strumento cross-platform per la creazione di applicazioni eseguibili su Windows partendo da applicazioni Java distribuite come Jar. L'eseguibile deve essere configurato per essere elaborato con la versione JRE disponibile nel proprio pc. Launch4J fornisce anche un'interfaccia user friendly tramite la quale è possibile impostare le opzioni di runtime, come la dimensione iniziale, l'heap-size massimo ecc... E' anche possibile assegnare un'icona di applicazione.


Installato e aperto Launch4j appare un'interfaccia a schede. Nella scheda Basic è necessario inserire il path dove si trova il file jar da convertire ed il path dove andrà creato il file exe di destinazione. Nella scheda JRE impostare la versione utilizzata per il progetto. A questo punto compilare il progetto cliccando il tasto ingranaggio ed eseguirlo col tasto play, o in alternativa un doppio click sul file eseguibile appena creato. Questo è solo un esempio basilare, come potete notare l'interfaccia è ricca di schede e parametri.


Il risultato dell'elaborazione è la creazione del file di testo output.txt contenente i tempi di esecuzione delle tre classi. Solo per curiosità, è interessante notare che le classi StringBuffer e StringBuilder hanno tempi di esecuzione molto più bassi della classe String.


Tempo di esecuzione testString() 2576 millis.
Tempo di esecuzione testStringBuffer() 5 millis.
Tempo di esecuzione testStringBuilder() 4 millis.


Nel prossimo post: Creare eseguibili schedulati con Quartz.

Hai apprezzato questo post? Conferma le mie competenze o scrivi una segnalazione sul mio profilo Linkedin!