2011-08-25 17 views
6

Sto lavorando con un progetto che viene configurato utilizzando la struttura di directory standard di Maven, quindi ho una cartella chiamata "risorse" e all'interno di questa ho creato una cartella chiamata "caratteri" e quindi inserisco un file. Devo passare il percorso completo del file String (di un file che si trova, all'interno della mia struttura di progetto, a resources/fonts/somefont.ttf) a un oggetto che sto usando, da una libreria di terze parti, come di seguito, ho cercato su questo per un po ' ma sono diventato un po 'confuso sul modo corretto di farlo. Ho provato come sotto ma non è in grado di trovarlo. Ho esaminato l'utilizzo di ResourceBundle ma ciò sembrava implicare la creazione di un oggetto effettivo File quando ho solo bisogno del percorso per passare a un metodo come quello riportato di seguito (non ho la chiamata di metodo effettiva di fronte a me, quindi basta dare un esempio dal mio memoria):Java (app web maven), ottenendo il percorso completo del file per il file nella cartella delle risorse?

FontFactory.somemethod("resources/fonts/somefont.ttf"); 

avevo pensato che ci fosse un modo, con un progetto con struttura di directory standard di Maven per ottenere un file dalla cartella delle risorse, senza dover utilizzare il percorso relativo completo dalla classe/package. Qualsiasi consiglio su questo è molto apprezzato.

Non voglio utilizzare un percorso hard-coded poiché diversi sviluppatori che lavorano al progetto hanno impostazioni diverse e voglio includerlo come parte del progetto in modo che ottengano direttamente quando controllano l'origine del progetto .

Questo è per un'applicazione web (Struts 1.3 app) e quando guardo nel file WAR esplosa (che sto facendo funzionare il progetto off di tramite Tomcat), il file e ':

<Exploded war dir>/resources/fonts/somefont.ttf 
+1

Cosa c'è di sbagliato con ottenere l'oggetto File dalla ResourceBundle, quindi utilizzando File.getAbsolutePath() per passare a FontFactory.somemethod()? (Tieni presente che non ti è garantito di ottenere un oggetto File se WAR non è espanso sulla distribuzione.) – BobG

+0

probabilmente non c'è niente di sbagliato :) Grazie, non sono così familiare con 'ResourceBundle' quindi non mi ero reso conto che avrebbe funzionato, grazie per il suggerimento – Rick

+0

In realtà lasciami postare qualche pseudo-codice che ho usato con successo sotto - non sono sicuro su ResourceBundle, ma Resource (out of Spring) funziona: – BobG

risposta

11

Codice :

import java.io.File; 
import org.springframework.core.io.*; 

public String getFontFilePath(String classpathRelativePath) { 
    Resource rsrc = new ClassPathResource(classpathRelativePath); 
    return rsrc.getFile().getAbsolutePath(); 
} 

Nel tuo caso, classpathRelativePath sarebbe qualcosa come "/resources/fonts/somefont.ttf".

+0

Non sto usando la primavera per questo particolare progetto, probabilmente dovrebbe essere partito quella parola chiave, a volte ho bisogno di farlo anche in primavera, quindi stavo cercando un modo che avrebbe funzionato in entrambe le puntate/primavera – Rick

+0

Piccola correzione al codice: ClassPathResource rsrc = new ClassPathResource (classpathRelativePath); In questo modo puoi chiamare il metodo .getFile() –

+0

@GoranNastov I documenti attuali mostrano una chiamata 'Resource # getFile()'; Puoi elaborare? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- –

0

È possibile cercare la risposta alla domanda su linee simili che ho avuto Loading XML Files during Maven Test run

La risposta data da BobG dovrebbe funzionare. Anche se è necessario tenere presente che il percorso per il file di risorse è relativo al percorso della classe corrente. Entrambe le risorse e i file di origine java sono in classpath

1

Se la directory delle risorse è nella radice della guerra, ciò significa che risorse/font/somefont.ttf sarebbe un "percorso virtuale" in cui quel file è disponibile. È possibile get the "real path" - il percorso del file system assoluto - dal ServletContext. Nota (nei documenti) che funziona solo se il WAR è esploso. Se il tuo contenitore esegue l'app dal file war senza espanderlo, questo metodo non funzionerà.

+0

lo eseguiamo come esploso e non vedo che possa essere modificato in qualsiasi momento, quindi questo dovrebbe funzionare, grazie per il suggerimento – Rick

3

È possibile utilizzare il seguito citato per ottenere il percorso del file:

String fileName = "/filename.extension"; //use forward slash to recognize your file 
String path = this.getClass().getResource(fileName).toString(); 

uso/passare il percorso dei metodi.

1
URL resource = getServletContext().getResource("/WEB-INF/classes/fonts/somefont.ttf"); 
String relativePath = resource.getPath(); 
+0

Non funziona se il percorso non può essere rappresentato negli URL e ottiene la codifica URL. –

Problemi correlati