Originariamente inviato da newhook
ho un problema. Dal mio ambiente di sviluppo mi sto caricando una risorsa in questo mode:
codice:
InputStream is = getClass().getResourceAsStream(File.separator+"source"+File.separatorChar+"prova.txr");
e fin qui tutto ok.

Ma quando creo il jar e lo eseguo, la mia risorsa non viene più trovata.
Permettimi di fare qualche premessa.

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.