Come ottenere il percorso della directory delle risorse a livello di codice


90

Ho il seguente layout di directory:

  • src
    • principale
      • Giava
      • risorse
        • sql (script per database)
        • primavera (configurazione)
      • webapp

All'interno di una classe ServletContextListener, voglio accedere ai file nella directory SQL ed elencarli. Fondamentalmente il mio problema è con il percorso, perché so che elencare i file in una directory in poche parole è:

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

Forse potrei usare l' ServletContextEventOggetto per provare a costruire un percorso versoresources/sql

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

Esiste qualcosa per impostare quel percorso in un modo relativo e non codificato? Qualcosa di simile new File("classpath:sql")(preferibilmente primavera se possibile) o cosa dovrei fare con il servletContext per puntare resources/sql?


Ci sono tre varianti di soluzione, a seconda della situazione: stackoverflow.com/a/56327069/715269
Gangnus

Risposte:


70

Presumo che il contenuto di src/main/resources/venga copiato WEB-INF/classes/all'interno del tuo .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");

Grazie!! questo ha funzionato per me, con quell'URL poi creo il percorso per il nuovo file e infine ottengo i file in quella directory.
yamilmedina

2
Non hai bisogno del file. Hai già un URL. Non puoi nemmeno presumere che ci sia un file o una directory. Il WAR potrebbe non essere stato spacchettato.
user207421

Cosa significa MyServletContextListener qui?
Tejesh Raut

@TejeshRaut È un segnaposto per una classe che implementa javax.servlet.ServletContextListener. L'ho usato come esempio perché la domanda aveva uno snippet da contextInitialized cui è un metodo definito ServletContextListenerdall'interfaccia.
Dev

63

Infine, 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();

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

2
Tieni presente che puoi ottenere un URL diverso con this.getClass (). GetResource ("/ sql"));
ShadowGames

Non funzionerà su tutti i contenitori. Tomcat, per esempio.
user207421

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

...

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

Vale la pena notare che questo limiterà le tue opzioni di distribuzione, ClassPathResource.getFile()funziona solo se il contenitore ha esploso (decompresso) il tuo file war.


7

Usa semplicemente la classe com.google.common.io.Resources . Esempio:

 URL url = Resources.getResource("file name")

Dopo di che hai metodi come: .getContent (), .getFile (), .getPath () ecc.


1
Supportano anche l'acquisizione di risorse mentre il codice viene eseguito da un file jar?
Displee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.