Permettimi di fare qualche premessa.Originariamente inviato da newhook
ho un problema. Dal mio ambiente di sviluppo mi sto caricando una risorsa in questo mode:
e fin qui tutto ok.codice:InputStream is = getClass().getResourceAsStream(File.separator+"source"+File.separatorChar+"prova.txr");
Ma quando creo il jar e lo eseguo, la mia risorsa non viene più trovata.
Innanzitutto il nome che si passa a getResource/getResourceAsStream non è una specifica sul file-system e nemmeno un URL nel senso generale (come si intende normalmente).
Invece è una specifica abbastanza particolare dove tra l'altro si dovrebbe sempre usare '/' per separare i path.
L'uso di File.separator/File.separatorChar è dubbio/discutibile. Perché su Windows equivale al \ che rende abbastanza malformato il URL complessivo che quei metodi determinano. Anche se tecnicamente poi dovrebbe riuscire a leggere dalla risorsa.
Quindi in linea generale: si usa / nella specifica della risorsa.
Altro punto è quello di sapere come e dove vengono cercate le risorse. Non conta di per sé la directory "corrente" e non conta nemmeno dove sono fisicamente i jar.
Conta il "classpath" !! Le risorse vengono cercate lungo il classpath.
Se la specifica della risorsa inizia con / allora viene cercata alla "radice" (non in un package per intenderci), altrimenti viene cercata basandosi sul package della classe sul cui java.lang.Class è stato invocato il getResource(AsStream).
Per chiarire, immaginiamo che in classpath (ad esempio sfruttando la variabile di ambiente CLASSPATH) ci siano 2 directory e 1 jar:
C:\Progetti\demo;C:\Programmi\miaapp.jar;C:\Prove
Se si ha una classe org.test.Prova e si fa ad esempio:
Prova.class.getResource("img/icona.gif")
allora la sequenza di ricerca è:
C:\Progetti\demo\org\test\img\icona.gif
poi
org/test/img/icona.gif dentro C:\Programmi\miaapp.jar (org è una cartella alla "radice" del jar)
poi
C:\Prove\org\test\img\icona.gif
Il primo che trova ... è ok.

Rispondi quotando