03 Aprile 2012, 20:14:54 Ultima modifica: 04 Aprile 2012, 10:42:17 di tonywhite
Pubblico una piccola chicca che vi aiuterà a distribuire più facilmente i vostri programmi Java.

Capita qualche volta di dover dare un programma java a qualcuno che non sia un programmatore, beta tester, smanettone o Mac Gyver. E questo "qualche volta" coincide con il rilascio ufficiale del programma.
Nella situazione più semplice hai un file jar, fai doppio click e il tuo programma parte.
Nella situazione più tragica (99%) devi installare librerie native esterne, cambiare classe di avvio, passare argomenti, fare in modo che tutto possa essere portable e forse il programma parte.

Il classpath viene trattato in molti forum ed è più o meno la stessa solfa: devi installare le librerie a mano e quindi addio alla mia bella applicazione portable. Se invece l'applicazione non è bella, direte addio alla vostra brutta applicazione portable.

Supponiamo di avere un'applicazione (resisti.jar) che fa uso delle librerie nyan.so nyan.dll nyan.jnilib gestite da nyan.jar.
La nostra applicazione potrà essere portable grazie a questo script di avvio (lo so, "script" è una parola grossa)
Codice (resisti) Seleziona
#!/bin/sh
APPDIR=$(dirname "$0")
java -Djava.library.path="$APPDIR" -cp "$APPDIR/*" Resisti $@


APPDIR=$(dirname "$0") è la cartella corrente
java avvia la Java Virtual Machine (JVM)
-Djava.library.path="$APPDIR" definisce le librerie native: nyan.so nyan.dll e nyan.jnilib
-cp "$APPDIR/*" definisce il classpath dei nostri jar: nyan.jar e resisti.jar
Resisti è il nome della classe che contiene il metodo main
$@ serve per passare gli argomenti all'applicazione senza mettere mano allo script (parola grossa[CITAZIONE NECESSARIA])


Script batch per Windows
Codice (resisti.bat) Seleziona
echo off
set "appdir=%~dp0"
java -Djava.library.path="%appdir%" -cp "%appdir%Pacchetto.jar;%appdir%Supporto.jar;%appdir%Nyan.jar;%appdir%Resisti.jar" Resisti %*


echo off disabilita l'eco delle istruzioni
set "appdir=%~dp0" è la cartella corrente
java avvia la Java Virtual Machine (JVM)
-Djava.library.path="$APPDIR" definisce le librerie native: nyan.so nyan.dll e nyan.jnilib
-cp "%appdir%Pacchetto.jar;%appdir%Supporto.jar;%appdir%Nyan.jar;%appdir%Resisti.jar" definisce il classpath dei nostri jar uno per uno
Resisti è il nome della classe che contiene il metodo main
%* serve per passare gli argomenti all'applicazione senza mettere mano allo script (parola grossa[CITAZIONE NECESSARIA])


E buttate tutto brutalmente in una cartella.
L'unica cosa che cambia tra un sistema operativo e l'altro è lo script. Ma siccome con Linux copre più del 99% dei sistemi operativi esistenti e Windows il 0,9% su questo pianeta, mi posso ritenere soddisfatto e dire che l'applicazione è portable ed anche crossplatform.
Cotto e mangiato Ed il gioco è fatto.

#1 04 Aprile 2012, 10:32:10 Ultima modifica: 04 Aprile 2012, 10:42:52 di tonywhite
Changelog
Ho aggiunto lo script di avvio per Windows

Tuttora sono presenti i seguenti bug

  • Windows: Non è possibile indicare tutti i jar con * ma si devono scrivere tutti uno per uno
  • Non puoi usare un percorso con spazi, ergo il path fa cagare

Ulteriori aggiornamenti a breve


Grazie Genno. :ueue:
Lo script batch in confronto ad una montagna di merda di un grasso mammuth che soffre di diarrea fa decisamente più schifo :facepalm:
Cambia per ogni sistema Windows che testo :facepalm:


La combinazione dei due rende la distribuzione di un programma java non più difficile di quella di un programma .net, con la differenza che senza il secondo lo distribuisci senza il minimo problema anche sui sistemi veramente operativi :asd:
J:
unita' 4/1981
comp: 7.99%

Il primo mi piace e mi hai risparmiato mezza giornata di lavoro +1 :gtfo:
Mi vedrò il secondo con più calma :beer: