Ik heb de volgende mapindeling:
- src
- hoofd
- java
- bronnen
- sql (scripts voor database)
- lente (configuratie)
- webapp
Binnen een ServletContextListener-klasse wil ik toegang krijgen tot de bestanden onder de SQL-directory en ze weergeven. Eigenlijk zit mijn probleem in het pad, omdat ik weet dat het in een notendop weergeven van bestanden onder een map is:
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
Misschien kan ik het ServletContextEvent
-object gebruiken om te proberen een pad te bouwen naar resources/sql
public void contextInitialized(ServletContextEvent event) {
event.getServletContext(); //(getRealPath etc.)
}
Bestaat er iets om dat pad op een relatieve, niet-hardcoded manier in te stellen?
Iets als new File("classpath:sql")
(bij voorkeur spring indien mogelijk) of wat moet ik doen met de servletContext om te verwijzen naar resources/sql
?
Antwoord 1, autoriteit 100%
Ik neem aan dat de inhoud van src/main/resources/
wordt gekopieerd naar WEB-INF/classes/
in je .war tijdens het bouwen. Als dat het geval is, kun je dat gewoon doen (de klassenaam en het pad dat wordt geladen door echte waarden vervangen).
URL sqlScriptUrl = MyServletContextListener.class
.getClassLoader().getResource("sql/script.sql");
Antwoord 2, autoriteit 90%
Eindelijk, dit is wat ik deed:
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();
Antwoord 3, autoriteit 22%
import org.springframework.core.io.ClassPathResource;
...
File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();
Het is vermeldenswaard dat dit uw implementatie-opties beperkt, ClassPathResource.getFile()
werkt alleen als de container uw war-bestand heeft ontploft (uitgepakt).
Antwoord 4, autoriteit 12%
Gebruik gewoon com.google.common.io.Resourcesklasse. Voorbeeld:
URL url = Resources.getResource("file name")
Daarna heb je methoden zoals: .getContent(), .getFile(), .getPath() etc