2013-10-16 15 views
38

Ho la seguente struttura delle directory:Come ottenere directory delle risorse percorso di programmazione

  • src
    • principale
      • java
      • risorse
        • SQL (script per il database)
        • molla (configurazione)
      • webapp

All'interno di una classe ServletContextListener, voglio accedere ai file nella directory di SQL e la lista loro. Fondamentalmente il mio problema è con il percorso, perché so che l'elenco dei file in una directory in poche parole è:

File folder = new File(path); 
File[] listOfFiles = folder.listFiles(); 

forse avrei potuto usare il ServletContextEvent oggetti per cercare di costruire un percorso per resources/sql

public void contextInitialized(ServletContextEvent event) { 
    event.getServletContext(); //(getRealPath etc.) 
} 

Esiste qualcosa per impostare quel percorso in modo relativo, non codificato? Qualcosa come new File("classpath:sql") (preferibilmente molla se possibile) o cosa devo fare con il servletContext per puntare su resources/sql?

risposta

28

Suppongo che il contenuto di src/main/resources/ sia copiato in WEB-INF/classes/ all'interno del proprio .war al momento della compilazione. Se questo è il caso, puoi semplicemente farlo (sostituendo i valori reali per il nome della classe e il percorso che viene caricato).

URL sqlScriptUrl = MyServletContextListener.class 
         .getClassLoader().getResource("sql/script.sql"); 
+0

Grazie !! questo ha funzionato per me, con quell'URL quindi ho creato il percorso per il nuovo file e infine ho ottenuto i file in quella directory. – whyem

+2

Non è necessario il file. Hai già un URL. Non si può nemmeno presumere che ci sia un file o una directory. La GUERRA potrebbe non essere stata decompressa. – EJP

+0

Che cosa significa MyServletContextListener qui? –

7
import org.springframework.core.io.ClassPathResource; 

... 

File folder = new ClassPathResource("sql").getFile(); 
File[] listOfFiles = folder.listFiles(); 

Vale la pena notare che questo limitare le opzioni di distribuzione, ClassPathResource.getFile() funziona solo se il contenitore è esploso (decompresso) il file di guerra.

34

Finalmente questo è quello che ho fatto.

private File getFileFromURL() { 
    URL url = this.getClass().getClassLoader().getResource("/sql"); 
    File file = null; 
    try { 
     file = new File(url.toURI()); 
    } catch (URISyntaxException e) { 
     file = new File(url.getPath()); 
    } finally { 
     return file; 
    } 
} 

...

File folder = getFileFromURL(); 
File[] listOfFiles = folder.listFiles(); 
+4

Sei sicuro di usare '"/sql "' come parametro? Ho problemi con una barra iniziale, invece '' sql ''funziona. – Abdull

Problemi correlati