Як програмно отримати шлях до каталогу ресурсів


86

У мене такий макет каталогу:

  • src
    • головний
      • java
      • ресурсів
        • sql (скрипти для бази даних)
        • пружина (конфігурація)
      • веб-додаток

У класі 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");

Дякую!! це спрацювало для мене, за цією URL-адресою я будую шлях до нового файлу і нарешті отримую файли в цьому каталозі.
yamilmedina

2
Вам не потрібен файл. Ви вже маєте URL-адресу. Ви навіть не можете припустити, що файл чи каталог взагалі є. Можливо, WAR не було розпаковано.
Маркіз Лорнський

Що тут означає MyServletContextListener?
Tejesh Raut

@TejeshRaut Це тримач місця для класу, який реалізує javax.servlet.ServletContextListener. Я використав це як приклад, оскільки запитання мало фрагмент, з contextInitialized якого є метод, визначений ServletContextListenerінтерфейсом.
Dev

59

Нарешті, це те, що я зробив:

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
Зверніть увагу, що за допомогою this.getClass (). GetResource ("/ sql")) ви можете отримати іншу URL-адресу;
ShadowGames

Це буде працювати не у всіх контейнерах. Tomcat, наприклад.
маркіз

16
import org.springframework.core.io.ClassPathResource;

...

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

Варто зазначити, що це обмежить ваші варіанти розгортання, ClassPathResource.getFile()працює лише в тому випадку, якщо контейнер вибухнув (розпакував) ваш військовий файл.


6

Просто використовуйте клас com.google.common.io.Resources . Приклад:

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

Після цього у вас є такі методи, як: .getContent (), .getFile (), .getPath () тощо.


1
Чи підтримують вони також отримання ресурсів під час виконання коду з jar-файлу?
Displee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.