Newsgroup: it.comp.java
Titolo: "snellire" un *.jar

Vorrei distribuire un Applet che utilizza una libreria con una versione
"personalizzata" di questa; in pratica per ridurre le dimensioni del
JAR, che altrimenti e' troppo voluminosa per il trasferimento via
internet. Visto che il problema mi sembra comune, in che modo lo avete
risolto? Io pensavo anche di far installare le classi in locale, e poi
fare una pagina con un Applet che verificava se le classi erano gia'
presenti o meno, e quindi a seconda dei casi caricava una pagina
opportuna (con o senza download delle classi).
Altre idee ?
--
Greetings, Alessandro
http://www.esalab.it
Pesaro, Italy
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.

 risolto?
Con VisualCafe danno il JAR packager, che fa esattamente questo.
In realta', usando la reflection (oltre ad un po' di filtering sulle
classi "java.*" o "javax.*" di sistema) e' possibilissimo elencare
tutte e sole le classi usate da una certa classe - applicando questo
all classe "applicazione"/"applet" hai il tuo risultato.
--
God is Real, unless declared Integer


 Con VisualCafe danno il JAR packager, che fa esattamente questo.
argh... non ce l'ho; e le classi sono abbastanza annidate (io uso poche
classi ma queste a loro volta ne usano altre, molte private, nel
package); dici che basta applicare la reflection al primo livello per
ottenere tutto? se no, un metodo alternativo? e poi, visto che le classi
hanno il certificato, in questo modo me lo perdo o posso usare lo stesso
certificato per il package ridotto?
se non c'e' altro modo, esiste una demo di Visual Cafe' per provare
questa possibilita'?
--
Greetings, Alessandro
http://www.esalab.it
Pesaro, Italy


 Altre idee ?


 questa possibilita'?
Credo di si - anche se per i dettagli temo che dovrai dare un'occhiata
al sito symantec.
Ciao,
  Cris
--
God is Real, unless declared Integer


 locale. Vedi:
Ho provato, ma mi da' javascript error e l'esempio e' praticamente quasi
uguale ad una delle demo. Questo e' lo script, la funzione downloadNow()
parte cliccando su un pulsante... non e' proprio che io sia un guru di
javascript, anzi...
<SCRIPT>
no cAlert();
function downloadNow () {
// Make sure Java is enabled before doing anything else.
if ( navigator.javaEnabled() ) {
   // Create a version object and a software update object
   vi = new netscape.softupdate.VersionInfo(1, 0, 0, 0);
   su = new netscape.softupdate.SoftwareUpdate(this,
"QueryParticellaClient");
   // Start the install process
   err = su.StartInstall("java/download/esalab/QueryParticellaClient/",
vi,
      netscape.softupdate.SoftwareUpdate.LIMITED_INSTALL);
   if (err == 0) {
      // Find the Java download directory on the user's computer
      JavaFolder = su.GetFolder("Java Download");
      // Install the JAR file. Unpack it and list where it goes
      err = su.AddSubcomponent("QueryParticellaClient JAR", vi,
"viewer.jar",
         JavaFolder, "", this.force);
   }
   // Unless there was a problem, move the JAR file to its final
   // location and update the Client Version Registry
   if (err != 0)
      su.AbortInstall();
   else {
      su.FinalizeInstall();
      cAlert("Installation complete. You must restart Communicator
         to use the new Java classes.");
   }
}
}
</SCRIPT>
--
Greetings, Alessandro
http://www.esalab.it
Pesaro, Italy


Caro Alessandro,
il tuo install script (lo chiamo setup.js) va bene...adesso lo devi
"impacchettare" (scusa, ma lavoro in inglese e non sempre so la traduzione
dei termini giusti!) in un altro JAR file (lo chiamo install.jar), che
contenga il tuo script e il JAR file che vuoi installare. Firma questo JAR
usando il comando
signtool -d"C:\Program Files\Netscape\Users\<Alessandro>" -k <"la tua firma
digitale"> -c 9 -i setup.js -Z install.jar <directory con setup.js e JAR
file>
Piú o meno il comando dovrebbe essere questo. Se apri questo file con
Netscape, il tuo JAR file (interno) viene installato e tu hai risolto il tuo
problema (fammi sapere).
Per automatizzare l´installazione devi scrivere un trigger file cosí come
descritto nel link che ti ho precedentemente inviato.
Ciao
Candida


 Con VisualCafe danno il JAR packager, che fa esattamente questo.
ho scaricato la demo di VisualCafe, ho provato AutoJar (credo che ti
riferissi a quello), e mi ha inserito solo le classi del mio progetto e
non quelle che ho importato; io ho una directory inclusa nel CLASSPATH
che contiene moltissime classi, per vari usi. Ora vorrei che le classi
usate in questa directory (non tutte) venissero incluse nel JAR, assieme
a quelle
del mio progetto che le utilizzano.
il jar packager puo' fare anche questo?
magari ho solo sbagliato a definire il progetto; ho incluso tutti i
files sorgenti creati da me, e nelle opzioni


 il jar packager puo' fare anche questo?
Hm, prova ad inserire anche tutte quelle classi nel progetto, proprio
come .class.
Comunque, stimolato dalla tua domanda e dato che mi serve :) - e dove
lavoro ora non hanno VC - ho ritrovato l'abbozzo di packager che stavo
costruendo tempo fa; questo ti calcola le classi necessarie (usando un
filtro per selezionare quelle che vuoi).
Sto ultimando la parte che costruisce il JAR vero e proprio.
Appena l'ho concluso, posso mettere il sorgente sotto GPL e inviartelo.
Purtroppo, la settimana prossima sono in vacanza e il modem di casa e'
morto l'altro ieri (e tra l'altro non sarei neanche a casa).. quindi se
ne riparla tra una settimana almeno. :(
-cs
--
God is Real, unless declared Integer


 Appena l'ho concluso, posso mettere il sorgente sotto GPL e
inviartelo.
Magari ! il fatto e' che e' un package mastodontico, ad ogni release
aggiungono 200k, e se lo "ripulisco" a mano poi alla prossima release
sono da capo; ci conto...
--
Greetings, Alessandro
http://www.esalab.it
Pesaro, Italy


 sono da capo; ci conto...
Finalmente :), puoi trovare il tutto  a
 
http://space.tin.it/computer/csadun/software/cpacker/index.html
Ovviamente e' in beta, ma ci ho giochicchiato un po' e pare funzionare
bene. Spero non ci siano problemi con JAR grossi come il tuo.. :)
--
God is Real, unless declared Integer


 bene. Spero non ci siano problemi con JAR grossi come il tuo.. :)
ti ringrazio, prelevo e provo; nel frattempo ho provato anche dash-o su
http://www.preemptive.com
.
Rinomina le classi, metodi e variabili per offuscare il codice e
risparmiare spazio, elimina anche metodi non usati; pero' va in crisi
con il mio package, problemi determinati dall'uso di forName(),
getBundle() e dall'uso della Reflection in certi metodi
--
Greetings, Alessandro
http://www.esalab.it
Pesaro, Italy


 bene. Spero non ci siano problemi con JAR grossi come il tuo.. :)
complimenti, funziona!
unici problemi ne ho trovati con delle Class.forName() (in pratica ho
delle classi che si caricano delle risorse in <nomeclasse>iconRsc.class)
, e con dei messaggi di internazionalizzazione caricati con getBundle().
sono arrivato a 434k, partendo da 850k di libreria a cui dovevo
aggiungere le mie classi.
come ulteriore passo vorrei provare un code obfuscator, che' ho visto
che tra l'altro diminuiscono molto le dimensioni delle classi usando
identificatori molto corti: hai da consigliare qualcosa ? (escluso
dash-o, che ho gia' provato ma da' troppi problemi);


 aggiungere le mie classi.
Good. :)
--
God is Real, unless declared Integer


 altrettanto comuni (ad esempio, il tuo).
stesse conclusioni del manuale di dash-o; per me va bene un package
"minimo", poi provando a far girare il programma si riesce a trovare
cosa manca (in genere poca cosa)
--
Greetings, Alessandro
http://www.esalab.it
Pesaro, Italy


