Java получение ресурсов из jar и нет

363
29 января 2017, 12:56

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

      Bootstrap
              |
       Common CL
   /               |          \
AppCore Plugin1 PluginN

В классе Bootstrap для загрузки API плагинов необходимо получить файлы директории common делаю я это так:

URI uri = Bootstrap.class.getResource(Bootstrap.class.getSimpleName() +".class").toURI
if (!"jar".equalsIgnoreCase(uri.getScheme())) { //не в jar
        logger.severe("Source \"" + Bootstrap.class.getSimpleName() + ".class\" is not in a jar file!");
    }
try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.emptyMap())) {
   Files.list(fs.getPath("/")).forEach(System.out::println);//выводим список фалов

проблема в том что этот код работает только когда запускается из jar, при отладке и запуске через ide он не работает и выдает ошибку

java.lang.IllegalArgumentException: Path component should be '/'

хотя System.out.println(uri.getPath()); дает верный путь вида /D:/WORKSPACE/PluginIncludingSave/out/production/PluginIncludingSave/load/Bootstrap.class

Я понимаю что это связано с тем что ide пускает код не из jar

Вопрос, есть ли возможность как то обойти это, чтоб код, получающий директорию и потом список файлов в ней, одинаково работал и в ide и в jar ( возможно сделать 2 варианта получения этой директории)? В инете ничего дельного не нашел, все предлагают использование потока и getResourceAsStream(); Но я не нашел как через InputStreamполучить содержимое директории и потом загружать файлы или получать url для UrlClassLoader-а

READ ALSO
Чтение переменной реестра с типом reg_binary

Чтение переменной реестра с типом reg_binary

Как считать значение переменной реестра типа reg_binary? К примеру значение переменной типа reg_sz читаю кодом нижеНо при попытке обратиться к типу...

362
Выборка из БД Realm Android

Выборка из БД Realm Android

Решил попробовать данную БД для работы, но никак не пойму, как вытаскивать оттуда данныеЗанести получилось, потом использую: realm

531
DIV Внутри DIV-a

DIV Внутри DIV-a

Как сделать так, чтобы DIV который находится внутри основного DIV-a, выделялся на нем только в определенном месте? Выглядит это так: основной...

318
Включить отступы в ширину блока

Включить отступы в ширину блока

Всем приветЕсть код табов https://jsfiddle

282