Cercando nel forum ho trovato in molti che si chiedono come lanciare un'applicazione java come eseguibile, cioè cliccandoci sopra due volte.
Ho letto che alcuni usano jelude, tuttavia io non concordo totalmente con loro, in quando distribuire un'applicazione come unico eseguibile bianrio fa perdere una delle migliori capacità di java, la programmazione per componenti!
ad esempio se si progetta un'interfaccia grafica usando il pattern mvc e poi si crea un unico fiole monolitico, si perde un vantaggio non indifferende, e cioè il poter effettuare cambiamenti al software senza dover sostituire tutto il software.
Per poter lanciare un'applicazione java come se fosse un eseguibile c'è una soluzione, creare un eseguibile che richiami la jvm e gli passi come parametro la main class della nostra applicazione.
Per fare questo basta includere la classe unistd.h, la quale contiene la definizione dei tipi per la gestione dei processi.
Comunque passiamo alla pratica:
Aprite il dev-C++ (scaricabile gratuitamente) oppure il Visual C++.
Create un progetto win32 (mi raccomando non console altrimenti uscirà quella fastidiosa finestra nera del dos), se usate il dev sarà ancora più facile settarla inoltre scegliete il C come linguaggio, anche se la cosa sarà ininfluente, in quanto fortunatamente il C++ permette di programmare anche in maniera procedurale senza creare oggetti in maniera obbligatoria.
ora cancellate il file di default che il dev o il VC++ scrivono come main e aggiungete il seguente codice:
#include <windows.h>
#include <unistd.h>
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
execl("C:\\Sun\\AppServer\\jdk\\bin\\javaw.exe","j ava", "Test", NULL);
return 0;
}
l'unica riga che sarà necessario modificare per le varie applicazione è questa:
execl("C:\\Sun\\AppServer\\jdk\\bin\\java.exe","ja va", "Test", NULL);
dove C:\\Sun\\... è il path della jvm, grazie a questo meccanismo si può addirittura programmare la ricerca automatica da parte dell'eseguibile della jvm e il lancio di una jvm appositivamente inserita nella cartella dell'applicazione, anche se richiede qualche conoscenza un pò più approfondita del C o del C++;
dopo dicchè si dovranno riportare tutti gli argomenti che si devono passare al programma, tuttavia il primo argomento deve essere il programma stesso in quanto la funzione deve puntare a esso anche come argomento, infine per far capire alla funzione che gli argomenti sono finiti si deve aggiungere un puntatore a NULL.
esempio
voglio lanciare il file che ho chiamato Contabilita.class tramite javaw, dove i binari per l'esecuzione dei class si trovano in C:\miaLocazione\locazione\bin
execl("C:\\miaLocazione\\locazione\\bin\\javaw.exe ", "javaw", "Contabilita", NULL);
cosi' se un giorno dovrete aggiornare un qualsiasi class, non cambierà nulla nel lancio, in accordo a una filosofia di buona programmazione e di programmazione per componenti. Inoltre è possibile aggiungere all'eseguibile qualsiasi icona, cercate in rete per i rispettivi ambienti di programmazione dev e vc++ e vedrete che è semplicissimo.
Spero sto post sia d'aiuto a qualcuno.
PS:Importante per funzionare l'eseguibile deve trovarsi nella stessa cartella della main class.