Как получить путь к каталогам ресурсов программным путем
У меня есть следующий макет каталога:
- ЦСИ
- Основной
- 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() и т.д.