[Risolto] creare jar contenente altro jar su linux che giri anche su windows

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

[Risolto] creare jar contenente altro jar su linux che giri anche su windows

Messaggio da Lucio C »

Ho scritto un semplice programma java di test. Il main della main class (1) usa Toolkit.getDefaultToolkit().getScreenSize() per sapere le dimensioni dello schermo' (2) stampa tali dimensioni con System.out.println (3) usa un consueto idioma Swing per chiamare una classe myGui (4) la quale al momento crea un panel vuoto che occupa circa il 95% dello schermo.

Tutto quanto e' impaccato in un jar (testpane.jar) il cui manifest contiene

Codice: Seleziona tutto

Main-Class: test/testpane
Class-Path: test/lib/TableLayout-bin-jdk1.5-2009-08-26.jar
quindi il jar contiene in un subdirectory un altro jar (non mio) che definisce TableLayout (l'unico layout che capisco veramente :D ).
Questo funziona perfettamente se sposto e invoco java -jar testpane.jar su un altro sistema Linux (senza necessita di settare CLASSPATH)

Pero' se lo invoco su un sistema Windows non trova la classe TableLayout. In nessuno di N tentativi di cambiare la sintassi del manifesto, di avere fisicamente il jar su Windows, di settare CLASSPATH su Windows. Nessuna soluzione trovata in rete. Qualche idea ?
Ultima modifica di Lucio C il sabato 30 aprile 2022, 23:23, modificato 1 volta in totale.
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)
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: creare jar contenente altro jar su linux che giri anche su windows

Messaggio da nuzzopippo »

Ciao @Lucio C

Sono molti anni che non utilizzo più java e, inoltre, non mi sono mai interessato molto al funzionamento in ambiente windows di ciò che sviluppavo, pertanto prendimi con molle lunghe 1 Km, ho molto dimenticato.

Vedo nello stralcio del Tuo "manifest" che indichi un percorso probabilmente relativo alla Tua home utente nel sistema su cui sviluppi, situazione probabilmente inesistente sul sistema windows su cui vai a provare il Tuo programma di test, credo tu debba rendere relative allo jar stesso i path indicati.
A suo tempo, qualche volta distribuivo sui computer windows dei colleghi ciò che sviluppavo (con OpenJDK e netbeans) e di solito distribuivo lo jar che sviluppavo assieme ad una directory "lib" contenente le librerie utilizzate (ulteriori jar) posizionata nella stessa directory contenente lo jar, nel manifest (creato atomaticamente da Netbeans) erano contenute la classe si start della applicazione ed il percorso relativo (allo jar sviluppato) delle librerie con specificati i singoli jar ... in un caso "simile" al Tuo, supposto di chiamare "Main" la classe di start della applicazione, sarebbe stato qualcosa del genere:

Codice: Seleziona tutto

Main-Class: testpane.Main
Class-Path: lib/TableLayout-bin-jdk1.5-2009-08-26.jar
Ovviamente potrebbe anche volerci l'indicazione del "package" all'interno dei vari moduli di codice redatti, prova un po' a fare indicazioni del genere, naturalmente con i dovuti aggiustamenti.

Ciao
Fatti non foste a viver come bruti ...
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: creare jar contenente altro jar su linux che giri anche su windows

Messaggio da Lucio C »

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)
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: creare jar contenente altro jar su linux che giri anche su windows

Messaggio da Lucio C »

Confermo.

Codice: Seleziona tutto

 jar xvf test/lib/TableLayout-bin-jdk1.5-2009-08-26.jar
 rmdir META-INF
 jar cvfm testpanealone.jar manifest.txt test/*.class info/* 
Spacchettando il jar libreria e reincludendo le classi nel mio jar, senza class path nel manifesto, questo gira standalone. Risolto.
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)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti