Dopo aver fatto un certo numero di prove sono giunto alla conclusione che il Class-path: nel manifesto
NON e' relativo alla root del jar stesso (a differenza di Main-Class) ma al directory corrente sulla macchina dove si invoca il jar !
Quello che io immaginavo era che in fase di compilazione si facesse
Codice: Seleziona tutto
setenv CLASSPATH /vatte/la/pesca/qualche.library.jar
javac packagename/*java
jar cvf nome.jar manifest.txt packagename/*
e poi si potesse fare girare
java -jar nome.jar ovunque e senza bisogno di settare CLASSPATH
Questo in realta' e' vero se invoco il jar
sulla stessa macchina e nella stessa directory dove lo ho compilato,
oppure se invoco il jar sulla stessa macchina e il Class-path: nel manifesto e' un path
assoluto su quella macchina. Sono andato a guardare i jar che avevo fatto in passato (alcuni che usavano tecnologie obsolete tipo applet o JWS) ma nessuno usava Class-path: salvo un caso di un CGI web tuttora in uso che appunto usa un path
assoluto locale.
Invece recentemente avevo fatto le prove spostando
nome.jar dapprima dalla macchina Linux di casa a quella pure Linux di ufficio. Siccome dapprima non andava per una questione di incompatibilita' di versione di java, avevo provato a fare la compilazione sulla macchina di ufficio. E ovviamente per fare i jar avevo copiato l'intero directory
test incluso
test/lib con dentro
qualche.library.jar. Poi ho capito di poter compilare a casa con
--release 8 in modo da generare un jar compatibile con la macchina di ufficio. E li' il jar girava. Ma era solo per caso dato che
test/lib/qualche.library.jar esisteva ormai su entrambe le macchine sotto il directory corrente ! Invece il jar non girava affatto su un sistema Windows.
Ma anche addirittura sulla macchina locale, se io sposto
nome.jar in qualche altro directory e lo faccio girare da la', non gira piu'.
E se in tale directory creo un
test/lib/qualche.library.jar allora gira !
E sulla macchina Windows avendo copiato sotto Desktop
Desktop\test\lib\qualche.library.jar si mette a girare, sia invocando java da shell che perfino con doppio click.
Quindi apparentemente
una soluzione se si vuole usare una "libreria jar esterna" occorre
copiarla fisicamente (mentre non serve includere il jar nel jar).
Sono andato a guardare anche alcuni altri jar che avevo (non miei) come Aladin (un noto tool di visualizzazione dati astronomici del CDS), o un tool dell'ESA, o uno fatto da dei colleghi dell'universita' di Liegi. E ho visto che i relativi manifesti non usano Class-path: ma solo Main-Class, ma d'altra parte possono includere nel jar
piu' di un package in forma di subdirectory interni al jar ma che contengono direttamente le classi,
non altri jar. Alcuni di questi paiono librerie di utility tipo
com/mysql/jdbc nom/tam org/gjt/mm/mysql .
Quindi
forse una altra soluzione sarebbe s-tarare (s-jarare ?) i jar di libreria e poi includere le relative directory e classi nel jar "da distribuire.
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)