[Java] Includere risorse in un JAR eseguibile

xneo1
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:
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
onlyReferee
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.

xneo1
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?

onlyReferee
Prova intanto a stampare la stringa che ti restituisce l'istruzione seguente
[...]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.

xneo1
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.

onlyReferee
Capito. Prova eventualmente a vedere se questo articolo contiene una soluzione al tuo problema...

xneo1
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.