Newsgroup: it.comp.java
Titolo: Installazione di programma autoaggiornante: consigli?

Ciao,
    sto lavorando ad un applicazioncina (java) che gira su una serie di PC collegati su
rete locale ad un server locale, che a sua volta e' connesso su rete geografica con un
server centrale. L'applicazione deve soddisfare questi requisiti tecnici:
1. viene usata e deve funzionare a rete locale/geografica scollegata
2. deve aggiornarsi automaticamente quando disponibile una nuova versione (viene scaricata
nottetempo dal server centrale al server locale con un processo gia' esistente)
3. dopo l'installazione deve essere disponibile un'icona sul desktop per lanciarla.
4. l'installazione iniziale puo' non essere presidiata, l'utente deve poterla fare in
autonomia sul proprio PC
    I client dell'applicazione si collegano ad un server locale, che a sua volta (quando
la rete funziona) e' collegato al server centrale: sul server locale non e' possibile
installare alcunche'.
    Ovviamente, ho subito pensato a WebStart, ma sfortunatamente questa tecnologia non e'
utilizzabile: l'applicazione infatti viene attivata proprio quando la rete con il server
centrale non funziona (il server centrale e' l'unico che potremmo toccare), e quindi non
sarebbe mai aggiornata!
    Quindi sono passato ad esaminare le varie possibilita', e ho deciso che avrei potuto
controllare l'installazione mediante un prodotto classico, nello specifico sto usando
quello di nullsoft, come consigliato da jigi tempo fa. 
    Per quanto riguarda l'auto-aggiornamento ho pensato di farlo "in casa": in pratica la
mia applicazione e' composta da un insieme di jar, alla partenza l'applicazione li
aggiorna se necessario e quindi attiva la classe principale. Il problema con questo
approccio e' che l'applicazione deve essere lanciata con un .bat (bleah!) con schiantata
dentro l'invocazione, ad esempio: 
"java -cp update.jar;app1.jar;app2.jar Startup" 
    Questo e' veramente triste, ma attualmente non mi vengono in mente altre idee... ho
anche pensato di impacchettare tutta l'applicazione in un singolo jar, copiare la
scorciatoia sul desktop e quindi lasciare che il doppio click dell'utente invochi
l'applicazione: molto + elegante e corretto, ma come lo aggiorno il jar? Una volta che e'
partito, e' partito! Dovrebbe re-startarsi per ricaricare il nuovo jar. Oppure dovrei
riscrivermi un classloader... brrr!
    Se avete idee, sono ben accette. Possibilmente in tempi brevi :-D, perche' ovviamente
il cliente ci ha anticipato la scadenza (eh, vabbe', mica e' colpa mia!). Se non sono
stato sufficientemente chiaro, scusatemi e chiedete.
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

 altre idee... 
Ahime', non ho idea se ci siano soluzioni preconfezionate. :(
Qui il problema fu risolto richiedendo all'utente il riavvio 
dell'applicazione dopo l'update - con un minimo di meccanismo per 
salvaguardare l'utente da problemi di rete (i.e. i jar di update sono prima 
copiati localmente, poi sovrascritti). Ad ogni partenza, se la rete e' su, 
l'applicazione fa un veloce check via http per verificare cos'e' 
aggiornato, si costruisce la lista della spesa, e voila'. La soluzione fu 
realizzata da un altro team quindi non so i dettagli. Opzionalmente, c'e' 
un meccanismo di replicazione tra "server centrale" (il nostro) e server 
locale che gestisce licenze, aggiornamenti, eccetera.
La cosa piu' incasinata (che non hanno risolto ;-) e' limitare al minimo le 
cose da scaricare, e gestire le incompatibilita': tra versioni successive 
compatibili dello stesso componente non c'e' mai problema, ma se ci sono 
incompatibilita' o gestisci le dipendenze, o riscarichi praticamente quasi 
tutto (soluzione possibile nel nostro caso, ma non sempre).
Per la partenza, un link nei menu' con l'invocazione della JVM funziona 
benone, ed e' ragionevolmente portabile (e' l'installer a cambiare, 
ovviamente). Se non vuoi che l'utente riavvii a mano, puoi fare lo spawn - 
in un processo separato - di una nuova JVM che lanci una classe il cui 
unico scopo e' ricevere un segnale di chiusura dell'applicazione dopo 
l'update, rilanciarla, e terminare. Siccome le pagine di codice della JVM 
sono in memoria, la cosa non dovrebbe richiede troppa memoria ne' essere 
lenta. Le proprieta' di sistema dovrebbero aiutarti a comporre da Java la 
linea di comando per fare lo spawn correttamente.
Tieni presente che non ho mai provato, quindi e' tutta teoria. :-)
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 Ahime', non ho idea se ci siano soluzioni preconfezionate. :(
Ora che mi viene in mente, LiveUpdate di Symantec - magari la tecnologia e' 
pubblico, puoi provare a dare un'occhiata.



Eh, mi sa che e' difficile farlo in modo portabile :-(
A proposito, non e' che qualcuno conosce un sistema furbo (scritto in java, ovviamente) 
per piazzare un icona sul desktop dell'utente? Mi piacerebbe fare anche l'installazione
tutto in java, esiste un prodottino che lo fa ma che manca di questa feature.
Grazie per la risposta!


ObjectZone - 
http://space.tin.it/computer/csadun
---



Mi sono dimenticato di citare il prodotto in oggetto:
http://www.yagga.net/java/miniinstaller/
Inoltre fornisce anche un classloader interessante che potrei pensare di usare:
http://www.yagga.net/java/metajar/
E last but not least, l'autore e' di Torino :-D (ciao!)
Mah! Comunque mi sa che ricorro alla soluzione naive, se nessuno ha altre idee...


 stato sufficientemente chiaro, scusatemi e chiedete.
Bene: più la scadenza è vicina e piu la soluzione deve esser comoda...
Scegli la strada del link ad una directory condivisa dato che è la strada
piu veloce e comoda...
Eppoi almeno ti crei un unico bat!
Ciao da Andrea
--
*************************************
          Andrea Musumeci
             programmatore
             java free lance
 
http://www.javalab.it
http://www.fauser.it/olimpo76
*************************************

 non si aggiornerebbe mai. 
Hm, se la nuova versione (o le nuove versioni dei componenti) sono gia' 
scaricate nottetempo da qualche parte, come dici in 2, la tua applicazione 
fa il polling in quella qualche parte a startup - "via http" e' solo uno 
dei modi, se proprio non puoi toccar nulla sul server locale, vai via file 
system..



Infatti, anche per questo per ora ho scelto la soluzione naive: quando l'applicazione
viene attivata e si aggiorna, e' necessario poi riavviarla :-D
Comunque ho deciso usare il meccanismo basato sui jar disponibile in java2, mi sembra piu'
politically correct: copio sul desktop una scorciatoia al .jar, quando l'utente fa doppio
click sul jar viene eseguita la classe definita nel manifest. E bon.
Certo ci fosse qualche altra possibilita'....
Grazie per la risposta!


ObjectZone - 
http://space.tin.it/computer/csadun
---


 qui tutto il casino. 
Si', e proprio quello che facciamo qui (credo :-).


 ha scritto nel messaggio
news:3cd65ad7...@news.inet.it...


 stato sufficientemente chiaro, scusatemi e chiedete.
Non so se possa servire, ma guarda 
www.beanshell.org
.
ciao
uL


Glup? La beanshell la conosco, la uso nei corsi di java... uhm... ti 
riferivi all'uso del classloader? Chiarisci, chiarisci, sia piu' 
speaking, please!!
Ciao,
    Bruno.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Il problema e' che io avrei voluto evitare di lanciare nuove VM java da
VM preesistenti, e comunque scrivere tutto in java.
Ciao e grazie per la risposta.
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
-- 


 speaking, please!!
Non posso essere piu' speaking perche' non ho capito il tuo problema :)
Era un consiglio a naso, avevo letto che volevi evitare i .bat (ma 
perche' poi? Capisco che i file script di Unix siano tutta un'altra cosa 
;)), cosi' ti ho lanciato una dritta - che dritta non era - sperando ne 
potessi cavare qualcosa di buono. Magari dal codice del ClassLoader, 
perche' no (a questo punto guarda pure l'Unified Class Loader di JBoss), 
oppure dalla possibilita' di scrivere codice Java on-the-fly ed eseguirlo.
Perche' poi ti possa essere utile, non lo so: sei tu l'esperto del 
dominio :)
uL