2013-01-04 9 views
11

Come convertire il nome di un file sul classpath in un nome file reale?Convertire un nome file percorso classe in un nome file reale

Ad esempio, supponiamo che la directory "C:\workspace\project\target\classes" si trovi sul percorso di classe. All'interno di tale directory è presente un file, ad esempio info.properties.

Come si determina (in fase di esecuzione) il percorso assoluto del file nel file info.properties, data solo la stringa "info.properties"?

Il risultato sarebbe qualcosa come "C:\workspace\project\target\classes\info.properties".

Perché è utile? Durante la scrittura dei test unitari, è possibile accedere ai file contenuti nelle risorse di test (src/main/resources) ma stanno lavorando con una libreria di terze parti o un altro sistema che richiede un vero nome file, non un riferimento relativo al percorso di classe.

Nota: ho risposto a questa domanda da solo, poiché ritengo sia un trucco utile, ma sembra che nessuno abbia mai fatto questa domanda prima.

risposta

16

utilizzare una combinazione di ClassLoader.getResource() e URL.getFile()

URL url = Thread.currentThread().getContextClassLoader().getResource(resource); 
if(url == null){ 
    throw new RuntimeException("Cannot find resource on classpath: '" + resource + "'"); 
} 
String file = url.getFile(); 

Nota per Windows: nell'esempio di cui sopra, il risultato effettivo sarà

"/C:/workspace/project/target/classes/info.properties" 

Se è necessario un percorso più simile a Windows (ovvero "C:\workspace\..."), utilizzare:

String nativeFilename = new File(file).getPath(); 
+5

cosa produrrà se la risorsa è all'interno di un barattolo? – radai

+1

@radai Ecco un esempio del risultato di un file in un jar: 'file:/C: /tools/some/path/jarfile.jar!/Internal/path/file.txt'. Per trovare un file di questo tipo usando la risposta sopra, devi fornire un percorso relativo alla radice del vaso - es. '" internal/path/file.txt "' – GreenGiant

+0

@radai Controlla anche [this] (http://stackoverflow.com/questions/12025689/filenotfoundexception-when-exporting-jar/12025740#12025740) –

Problemi correlati