Как получить путь к каталогам ресурсов программным путем

У меня есть следующий макет каталога:

  • ЦСИ
    • Основной
      • java
      • ресурсы
        • sql (скрипты для базы данных)
        • spring (конфигурация)
      • WebApp

В классе ServletContextListener я хочу получить доступ к файлам в каталоге SQL и перечислить их. В основном моя проблема связана с этим путем, потому что я знаю, что перечисление файлов в директории в двух словах:

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

Возможно, я мог бы использовать объект ServletContextEvent, чтобы попытаться построить путь к resources/sql

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

Существует ли что-то, чтобы установить этот путь в относительном, не жестко закодированном виде? Что-то вроде new File("classpath:sql") (желательно spring, если это возможно) или что мне делать с сервлетомContext, чтобы указать на resources/sql?

Ответ 1

Я предполагаю, что содержимое src/main/resources/ скопировано в WEB-INF/classes/ внутри вашего .war во время сборки. Если это так, вы можете просто (подставляя действительные значения для имени класса и загружаемого пути).

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

Ответ 2

Наконец, вот что я сделал:

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();

Ответ 3

import org.springframework.core.io.ClassPathResource;

...

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

Стоит отметить, что это ограничит ваши варианты развертывания, ClassPathResource.getFile() работает только в том случае, если контейнер взорвался (распаковал) ваш военный файл.

Ответ 4

Просто используйте класс com.google.common.io.Resources. Пример:

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

После этого у вас есть такие методы, как: .getContent(),.getFile(),.getPath() и т.д.