wake-up-neo.net

Wie kann ich das Verzeichnis des Ressourcenverzeichnisses programmgesteuert abrufen?

Ich habe folgendes Verzeichnislayout: 

  • src
    • main
      • Java 
      • ressourcen
        • sql (Skripte für Datenbank)
        • feder (Konfiguration)
      • web-App

Innerhalb einer ServletContextListener-Klasse möchte ich auf die Dateien im SQL-Verzeichnis zugreifen und sie auflisten. Im Grunde ist mein Problem mit dem Pfad, weil ich weiß, dass das Auflisten von Dateien unter einem Verzeichnis in einer Nussschale lautet:

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

Vielleicht könnte ich das ServletContextEvent-Objekt verwenden, um zu versuchen, einen Pfad zu resources/sql zu erstellen.

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

Gibt es etwas, um diesen Pfad auf eine relative, nicht hartcodierte Weise festzulegen? Etwas wie new File("classpath:sql") (vorzugsweise möglichst spring) oder was soll ich mit dem servletContext auf resources/sql zeigen?

55
whyem

Ich gehe davon aus, dass der Inhalt von src/main/resources/ zur Buildzeit in WEB-INF/classes/ in Ihrer .war kopiert wird. Wenn dies der Fall ist, können Sie dies einfach tun (indem Sie den Klassennamen und den geladenen Pfad durch reale Werte ersetzen).

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");
45
Dev

Zum Schluss habe ich das gemacht.

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();
44
whyem
import org.springframework.core.io.ClassPathResource;

...

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

Beachten Sie, dass dadurch Ihre Implementierungsoptionen eingeschränkt werden. ClassPathResource.getFile() funktioniert nur, wenn der Container Ihre Kriegsdatei explodiert (entpackt) hat.

12
samlewis

Verwenden Sie einfach com.google.common.io.Resources class. Beispiel:

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

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

0
grep