[Java] Includere risorse in un JAR eseguibile
ciao a tutti,
ho fatto delle ricerca su Google e nonostante la mole delle informazioni non sono ancora riuscito a risolvere il mio problema.
Premetto che lavoro su Eclipse.
Il mio progetto è organizzato in questo modo:
DIR_DI_PROGETTO:
|----src:
.....|----mioPackage:
..........|----ClassePrincipale.java
|----res:
.....|----font:
..........|----mioFont.otf
poi da Java Build Path > Libraries > add class folder, ho aggiunto la cartella res.
In ClassePrincipale.java c'è il seguente frammento di codice che serve a caricare un font non installato sul sistema:
Se eseguo da Eclipse tutto funziona alla perfezione, il font viene caricato senza problemi
Il problema si ha quando creo il file JAR, infatti il font non viene caricato.
Come posso includere il font nel JAR e farlo caricare correttamente?
Più in generale, come mi comporto quando ho altri tipi di risorse come file di testo o immagini?
ho fatto delle ricerca su Google e nonostante la mole delle informazioni non sono ancora riuscito a risolvere il mio problema.
Premetto che lavoro su Eclipse.
Il mio progetto è organizzato in questo modo:
DIR_DI_PROGETTO:
|----src:
.....|----mioPackage:
..........|----ClassePrincipale.java
|----res:
.....|----font:
..........|----mioFont.otf
poi da Java Build Path > Libraries > add class folder, ho aggiunto la cartella res.
In ClassePrincipale.java c'è il seguente frammento di codice che serve a caricare un font non installato sul sistema:
Font f=new Font("default", Font.PLAIN, 10); try { f=f.createFont(Font.TRUE_TYPE_FONT, getClass().getResourceAsStream("/font"+File.separator+"mioFont.otf")); // parte importante f=f.deriveFont(10f); } catch(IOException | FontFormatException e) {}
Se eseguo da Eclipse tutto funziona alla perfezione, il font viene caricato senza problemi
Il problema si ha quando creo il file JAR, infatti il font non viene caricato.
Come posso includere il font nel JAR e farlo caricare correttamente?
Più in generale, come mi comporto quando ho altri tipi di risorse come file di testo o immagini?
Risposte
Ciao xneo 
Non vorrei essere un po' troppo "semplicista" ma forse potrebbe essere soltanto un problema di come sono specificati i percorsi all'interno del programma... Io proverei inizialmente a mettere il tuo font nella stessa cartella del file java in questione per verificare se effettivamente è un problema di percorsi.
Fammi sapere.

Non vorrei essere un po' troppo "semplicista" ma forse potrebbe essere soltanto un problema di come sono specificati i percorsi all'interno del programma... Io proverei inizialmente a mettere il tuo font nella stessa cartella del file java in questione per verificare se effettivamente è un problema di percorsi.
Fammi sapere.
Ho messo il file mioFont.otf nel package mioPackage, ovviamente il percorso che ho scritto in getResourceAsStream è
"mioFont.otf", e così facendo tutto funziona.
Tuttavia io vorrei mantenere quella gerarchia, come posso risolvere?
"mioFont.otf", e così facendo tutto funziona.
Tuttavia io vorrei mantenere quella gerarchia, come posso risolvere?
Prova intanto a stampare la stringa che ti restituisce l'istruzione seguente
Relativamente a come deve essere strutturato il percorso (ad esempio // al posto di / per separare le cartelle o il fatto che possano essere presenti o meno caratteri al di fuori di quelli con codice compreso negli ASCII standard) questo dipende dal sistema operativo corrente in uso.
[...]getClass().getResourceAsStream("/font"+File.separator+"mioFont.otf")
Relativamente a come deve essere strutturato il percorso (ad esempio // al posto di / per separare le cartelle o il fatto che possano essere presenti o meno caratteri al di fuori di quelli con codice compreso negli ASCII standard) questo dipende dal sistema operativo corrente in uso.
Comunque il percorso è giusto perchè se lancio il programma da eclipse questo funziona.
Il problema è che il jar funziona solo se lo creo in DIR_DI_PROGETTO o se lo sposto insiema ad essa.
Quello che vorrei è mantenere mioFont.otf in res\font e una volta creato il JAR poterlo spostare dove voglio senza essere accompagnato dalla cartella res\font.
Cioè, possibile che un linguaggio come Java pensato per essere portabile non permetta di fare questa cosa?
PS: il carattere / messo all'inizio di un percorso in getResourceAsStream() sta ad indicare che le risorse le deve cercare a partire da DIR_DI_PROGETTO.
Se provo a sostituirlo con // o con \ o con \\ (e sono su Windows) ottengo delle eccezioni.
Il problema è che il jar funziona solo se lo creo in DIR_DI_PROGETTO o se lo sposto insiema ad essa.
Quello che vorrei è mantenere mioFont.otf in res\font e una volta creato il JAR poterlo spostare dove voglio senza essere accompagnato dalla cartella res\font.
Cioè, possibile che un linguaggio come Java pensato per essere portabile non permetta di fare questa cosa?
PS: il carattere / messo all'inizio di un percorso in getResourceAsStream() sta ad indicare che le risorse le deve cercare a partire da DIR_DI_PROGETTO.
Se provo a sostituirlo con // o con \ o con \\ (e sono su Windows) ottengo delle eccezioni.
Ho letto. Da quello che ho capito, gli è stato consigliato di inserire nel file MANIFEST.MF un tag classpath dove inserire il percorso del file.
Però non mi sembra il mio caso.
Però non mi sembra il mio caso.