Hoe programmatisch het bronnenmappad te krijgen

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

Other episodes