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

86

У меня следующая компоновка каталогов:

  • 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?

Ямилмедина
источник
Есть три варианта решения, в зависимости от ситуации: stackoverflow.com/a/56327069/715269
Гангнус

Ответы:

69

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

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");
Dev
источник
Благодарность!! это сработало для меня, с этим URL-адресом я создаю путь для нового файла и, наконец, получаю файлы в этом каталоге.
yamilmedina
2
Вам не нужен файл. У вас уже есть URL. Вы даже не можете предположить, что есть файл или каталог. Возможно, WAR не распаковали.
Marquis of Lorne
Что здесь означает MyServletContextListener?
Tejesh Raut
@TejeshRaut Это место для класса, который реализует javax.servlet.ServletContextListener. Я использовал это в качестве примера, потому что в вопросе был фрагмент, из contextInitialized которого был определен метод ServletContextListenerинтерфейса.
Dev
60

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

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();
Ямилмедина
источник
11
Вы уверены, что используете "/sql"в качестве параметра? У меня проблемы со стартовой косой чертой, вместо нее "sql"работает.
Абдул
2
Помните, что вы можете получить другой URL с помощью this.getClass (). GetResource ("/ sql"));
ShadowGames
Это не будет работать со всеми контейнерами. Tomcat, например.
Marquis of Lorne
16
import org.springframework.core.io.ClassPathResource;

...

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

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

Samlewis
источник
6

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

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

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

grep
источник
1
Поддерживают ли они также получение ресурсов во время выполнения кода из файла jar?
Displee