So rufen Sie den Ressourcenverzeichnispfad programmgesteuert ab

83

Ich habe das folgende Verzeichnislayout:

  • src
    • Main
      • Java
      • Ressourcen
        • SQL (Skripte für die Datenbank)
        • Feder (Konfiguration)
      • Web-App

Innerhalb einer ServletContextListener-Klasse möchte ich auf die Dateien im SQL-Verzeichnis zugreifen und sie auflisten. Grundsätzlich ist mein Problem mit dem Pfad, weil ich weiß, dass das Auflisten von Dateien unter einem Verzeichnis auf den Punkt gebracht ist:

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

Vielleicht könnte ich das ServletContextEventObjekt verwenden, um einen Pfad zu erstellenresources/sql

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

Gibt es etwas, um diesen Pfad relativ und nicht fest codiert festzulegen? So etwas wie new File("classpath:sql")(vorzugsweise Frühling, wenn möglich) oder was soll ich mit dem servletContext tun, um darauf zu zeigen resources/sql?

Yamilmedina
quelle
Je nach Situation gibt es drei Lösungsvarianten: stackoverflow.com/a/56327069/715269
Gangnus

Antworten:

68

Ich gehe davon aus, dass der Inhalt von src/main/resources/zum WEB-INF/classes/Zeitpunkt der Erstellung in Ihre .war-Datei kopiert wird. Wenn dies der Fall ist, können Sie dies einfach tun (indem Sie den Klassennamen und den zu ladenden Pfad durch echte Werte ersetzen).

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");
Dev
quelle
Vielen Dank!! Das hat bei mir funktioniert. Mit dieser URL erstelle ich den Pfad für die neue Datei und erhalte schließlich die Dateien in diesem Verzeichnis.
Yamilmedina
2
Sie brauchen die Datei nicht. Sie haben bereits eine URL. Sie können nicht einmal davon ausgehen, dass es überhaupt eine Datei oder ein Verzeichnis gibt. Der WAR wurde möglicherweise nicht entpackt.
Marquis von Lorne
Was bedeutet MyServletContextListener hier?
Tejesh Raut
@TejeshRaut Dies ist ein Platzhalter für eine Klasse, die implementiert wird javax.servlet.ServletContextListener. Ich habe das als Beispiel verwendet, weil die Frage einen Ausschnitt hatte, aus contextInitialized dem eine von der ServletContextListenerSchnittstelle definierte Methode stammt .
Dev
56

Schließlich habe ich Folgendes getan:

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();
Yamilmedina
quelle
11
Sind Sie sicher, "/sql"als Parameter zu verwenden? Ich habe Probleme mit einem Start-Schrägstrich, "sql"funktioniert stattdessen .
Abdull
2
Bitte beachten Sie, dass Sie mit this.getClass () eine andere URL erhalten können. GetResource ("/ sql"));
ShadowGames
Dies funktioniert nicht bei allen Containern. Tomcat zum Beispiel.
Marquis von Lorne
16
import org.springframework.core.io.ClassPathResource;

...

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

Es ist erwähnenswert, dass dies Ihre Bereitstellungsoptionen einschränkt und ClassPathResource.getFile()nur funktioniert, wenn der Container Ihre War-Datei aufgelöst (entpackt) hat.

Samlewis
quelle
6

Verwenden Sie einfach die Klasse com.google.common.io.Resources . Beispiel:

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

Danach haben Sie Methoden wie: .getContent (), .getFile (), .getPath () usw.

grep
quelle
1
Unterstützen sie auch das Abrufen von Ressourcen, während der Code aus einer JAR-Datei ausgeführt wird?
Displee