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?
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");
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();
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.
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