Как вывести список файлов в каталоге внутри пути к классам в веб-модуле

Внутри моего WEB-приложения есть путь к классам или каталог ресурсов с JSON и текстовыми файлами.

/classes/mydir/a.json  
/classes/mydir/b.json
/classes/mydir/b.txt
/classes/mydir/xyz.json

Мне нужен InputStream (чтобы передать Джексону JSON ObjectMapper) для всех файлов JSON в этом каталоге.

I do a

URL dirUrl = getClass().getResource("/mydir");

что дает мне

vfs:/content/mywar.war/WEB-INF/classes/mydir/

Это правильный каталог, но на любом следующем шаге с использованием классов toUri, File или nio выдается сообщение о том, что vfs не поддерживается.

Существуют ли какие-либо служебные классы (JBoss / EAP) для чтения ресурсов из пути к классам внутри JBoss EAP, или кто-нибудь может привести пример для создания списка файлов JSON каталога пути к классам? Надеюсь, я не использую еще одну зависимость.

Время выполнения: JBoss EAP 7.1.4.GA (WildFly Core 3.0.17.Final-redhat-1)
Java: 1.8.0_191-b12


person JStefan    schedule 29.03.2019    source источник


Ответы (2)


Вы можете использовать библиотеку Reflections для сканирования пакета в пути к классам:

Reflections reflections = new Reflections("mydir", new ResourcesScanner());
Set<String> resources = reflections.getResources(Pattern.compile(".*"));
System.out.println(resources); // [mydir/a.json, ...
person Karol Dowbecki    schedule 29.03.2019
comment
Фрагмент сработал не сразу, но он привел меня к фреймворку jboss-vfs, который я искал. Я бы предпочел не включать еще один фреймворк. Добавление еще одного фреймворка jboss кажется чище. А также прост в использовании. - person JStefan; 17.04.2019

Ответ от @Karol наконец привел меня к фреймворку RedHat jboss-vfs, который я искал. Поэтому я включил следующий артефакт maven в свой pom :

    <dependency>
        <groupId>org.jboss</groupId>
        <artifactId>jboss-vfs</artifactId>
    </dependency>

Затем делаю следующее:

URL dirUrl = getClass().getResource("/mydir");
VirtualFile vfDir = VFS.getChild(dirUrl.toURI());
List<VirtualFile> jsonVFs = vfDir.getChildren(new VirtualFileFilter() {
    @Override
    public boolean accepts(VirtualFile file) {
        return file.getName().toLowerCase().endsWith(".json");
    }
});
for (int i = 0; i < jsonVFs.size(); i++) {
    VirtualFile vf = jsonVFs.get(i);
    File f = vf.getPhysicalFile();
    MyClass fromJson = objectMapper.readValue(f, MyClass.class); 
    // Do something with it..
}

Именно то, что мне нужно.

person JStefan    schedule 17.04.2019