У меня следующая компоновка каталогов:
- src
- основной
- Ява
- Ресурсы
- sql (скрипты для базы данных)
- пружина (конфигурация)
- 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")
(желательно пружины, если возможно) или что мне делать с servletContext, на который нужно указывать resources/sql
?
Ответы:
Я предполагаю, что содержимое
src/main/resources/
копируется вWEB-INF/classes/
ваш .war во время сборки. Если это так, вы можете просто сделать это (подставив реальные значения для имени класса и загружаемого пути).URL sqlScriptUrl = MyServletContextListener.class .getClassLoader().getResource("sql/script.sql");
источник
javax.servlet.ServletContextListener
. Я использовал это в качестве примера, потому что в вопросе был фрагмент, изcontextInitialized
которого был определен методServletContextListener
интерфейса.Наконец, вот что я сделал:
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; } }
...
источник
"/sql"
в качестве параметра? У меня проблемы со стартовой косой чертой, вместо нее"sql"
работает.import org.springframework.core.io.ClassPathResource; ... File folder = new ClassPathResource("sql").getFile(); File[] listOfFiles = folder.listFiles();
Стоит отметить, что это ограничит ваши варианты развертывания,
ClassPathResource.getFile()
работает только в том случае, если контейнер взорвал (разархивировал) ваш файл войны.источник
Просто используйте класс com.google.common.io.Resources . Пример:
URL url = Resources.getResource("file name")
После этого у вас есть такие методы, как: .getContent (), .getFile (), .getPath () и т. Д.
источник