distribuzione

distribuire il prodotto finale all'utente

Ad un certo punto dopo aver fatto il programma bisogna darlo a chi ce lo ha chiesto... come?

Java è nato come linguaggio multipiattaforma e fin dall'inizio della sua storia la modalità per distribuire il software era quella di creare un file che gli utenti potessero eseguire su qualsiasi piattaforma soltanto avendo java installato. Questo approccio ha l'enorme vantaggio di permettere di avere un solo file che tutti coloro che hanno Java installato (su macOS, Linux o Windows) possono eseguire il programma. Ma tutti coloro che non hanno Java installato? La risposta è facile "lo installano".

Con l'arrivo di Java14 abbiamo però una alternativa in più: creare una applicazione che gira nativamente senza bisogno di avere Java installato. Questo grazie a nuovi strumenti e alla nuova licenza Open Source di Java.

jar

La modalità classica di creazione di un file da distribuire all'utente finale è quella di creare un "jar" cioè un file zip strutturato in una maniera particolare che contiene tutti i file .class che compongono il programma stesso più altri file utili alla sua esecuzione (ad esempio i file css o le immagini che abbiamo inserito).

Quando si fa doppio click cu uno di questi file zippati (che avranno ".jar" come estensione) su un computer con java installato viene automaticamente avviato java che a sua volta apre una specifica classe presente nel file.

La procedura per generare questo file dipende dall'ambiente di sviluppo utilizzato e include nel pacchetto creato tutte le classi presenti nel progetto.

Questo meccanismo un paio di problemi:

Creare una configurazione di avvio

Se non ci sono esigenze particolari basta aprire la classe principale della nostra applicazione e avviarla almeno una volta.

Produrre il paccheto jar

NetBeans ha un modo automatico per produrre questi particolari file zip (che avranno come estensione .jar) e per specificare quale è la classe che va avviata al doppio click.

Specificare la classe principale

Ogni progetto ha una classe che viene impostata da Netbeans al momento della sua creazione, in caso che serva di cambiarla:

Produrre il paccheto jar

A questo punto ogni volta che un progetto viene compilato viene anche creato il file jar, se non serve l'opzione può essere disattivata.

jpackage

Dalla versione 14 di Java nel JDK esistono degli strumenti che permettono di creare un programma direttamente eseguibile senza bisogno di installare prima java.

Creare molteplici versioni (una per Mac, una per Linux e una per Windows) del programma non è difficile, basta crearlo su piattaforma seguendo lo stesso procedimento.

Per partire utilizziamo un caso quasi semplice: HelloWorld scritto con JavaFX (senza l'uso dei moduli, sarebbe a dire che il file package.info [FIXME controlla nome] non ci deve essere). Il "quasi" è dovuto al fatto che usiamo una libreria (JavaFX) che non fa parte della distribuzione standard di Java.

Siccome lo strumento è molto nuovo e versatile non ci sono ancora strumenti automatizzati comodi da utilizzare, non è però difficile fare le operazioni manualmente.

Lo stesso procedimento va bene sia per Windows che per Linux che per macOS, l'unica richiesta è che per poter lavorare con Windows è necessario installare una versione di Bash (un interprete dei comandi molto comune sui sistemi Unix) e non va bene quello che fornisce Microsoft... per farla breve basta installare GIT e in automatico avremo anche GitBash che va bene per i nostri scopi.

Per Windows è necessario installatre from WiX 3.0 o più recente
All'avvio dice di aver bisogno di una specifica versione del framework .net, bisogna scaricare esattamente quella versione, ad oggi la 3.5.1

Un avviso prima di iniziare: attento alle "/", non fa lo stesso metterle oppure no.

Primo passo: cartella esportazione

Creare la cartella "esportazione" sul Desktop.

Secondo passo: l'icona.

Dobbiamo copiare sulla scrivania un file per l'icona della mnostra applicazione, il tipo del file dipende dal sistema operativo: hello.ico va bene per Windows (.icns va eben per macOS e .png va bene per Linux) che è l'icona della nostra applicazione.

NB: la cartella "hello" non deve esistere sul Desktop (nel caso di macOS, dal Finder, l'applicazione "hello" non deve esistere).

Terzo passo: far generare ad Eclipse un file jar del nostro progetto.

  1. Menu File/Export...
  2. selezionare gruppo "Java" e poi voce "JAR file"
  3. "Select the resource project to export:" basta selezionare il progetto che interessa, ciaomondo nel nostro caso (non importa esportare la sotto-cartella settings)
  4. spuntare "export generated class files and resources"
  5. nella voce "JAR file:" impostare "ciaomondo.jar" nella cartella "esportazione" creata prima
  6. premere "finish"

Quarto passo: copiare tutte le librerie

Bisogna copiare nella cartella esportazione tutte le altre librerie che usiamo. Questo è facile: basta andare nella cartella di javafx e copiare tutti i file jar (non la cartella stessa) presenti nella cartella lib in "esportazione". Se si usa Windows vanno copiati anche tutti i file presenti nella sottocartella bin sempre di JavaFX (nel caso di macOS tutti i .dylib presenti nella cartella lib e nel caso di Linux tutti i .so sempre nella cartella lib).

Quinto passo: terminale.

A questo punto bisogna aprire un terminale (Git Bash nel caso di Windows) e posizionarsi nella cartella Desktop.

Sesto passo: variabili di ambiente

Per evitare di impazzire bisogna impostare alcune variabili di ambiente, quelli riportati sono esempi presi da un ambiente Windows (ovviamente i percorsi potrebbero cambiare, ognuno dovrebbe sapere dove ha messo i diversi pezzi di software).

export JBIN=/c/java/jdk-14.0.1+7/bin

nel comando successivo attenzione al separatore dell cartelle, nei sistemi Unix il comando sotto va modificato scrivendo echo -n "$x:"

export JARS=$(ls esportazione/*.jar | while read x; do echo -n "$x;"; done)
export FX=/c/java/javafx-sdk-14.0.1/lib/
export ICONA=mondo.ico

L'ultima variabile, come detto al secondo passo, dipende dal sistema operativo.

Settimo passo: proviamo se va.

Per farlo è semplice: sempre dal terminale terminale, nella cartella Desktop scrivere:

$JBIN/java --add-modules javafx.controls,javafx.media,javafx.fxml \
--module-path $FX -cp $JARS ciaomondo.CiaoMondo

Se il programma non parte abbiamo fatto qualcosa di sbagliato. Cosa? dipende dal messaggio di errore, magari una delle variabili di ambiente o la copia dei file.

Ottavo passo: creazione del programma eseguibile.

La cartella hello non deve essere presente perché la vuole creare jpackage

$JBIN/jpackage --type app-image -n hello \
--icon $ICONA \
--input esportazione \
--module-path $FX \
--add-modules javafx.controls \
--main-class ciaomondo.CiaoMondo --main-jar ciaomondo.jar