Подтвердить что ты не робот

Нет доступа к ресурсу/файлу Bundle (OSGi)

В настоящий момент я разрабатываю WebApp на основе OSGi с Jetty и Equinox (см. http://wiki.eclipse.org/Jetty/Tutorial/EclipseRT-Jetty-Starter-Kit). Пока все хорошо, но я не могу получить доступ к некоторым файлам/ресурсам моего собственного пакета. Место/путь - "конфигурация/данные/config.csv" и "configuration/data/data.zip". Я проверил все:

context.getBundleContext().getBundle().getEntry("config.csv");
context.getBundleContext().getBundle().getResource("config.csv");
this.getClass().getClassLoader().getResource("config.csv");
context.getBundleContext().getDataFile("config.csv");

И, конечно, все возможные варианты пути, такие как: "configuration/data/config.csv", "/configuration/data/config.csv", "\ configuration/data/config.csv", "/config.csv", Более того, я добавил папки в путь к OSGi (в MANIFEST.MF):

Bundle-ClassPath: .,
 configuration/data/

Получающийся URL-адрес всегда выглядит примерно так (или null): "configuration/CBR-Data/config.csv", и когда я переношу его в объект File "D:\configuration\CBR-Data\config.csv",.

Но я действительно не понимаю, что файл свойств для одного из моих DS загружен отлично:
<properties entry="configuration/dsconfig.properties"/>

Есть ли у кого-то идея/подсказка или что-то еще? Я с ума сошел...

4b9b3361

Ответ 1

Вы правильно извлекаете ресурс из пакета. Я предлагаю ознакомиться с разницей между getEntry(), getResource() и getDataFile().

Поскольку методы возвращают правильные URL-адреса, это означает, что ресурс правильно расположен, и проблема в том, как вы их читаете.

Двумя способами их использования являются:

  • Откройте InputStream непосредственно из URL:
 

    URL configURL = context.getBundleContext().getBundle().getEntry("configuration/data/config.csv");
    if (configURL != null) {
        InputStream input = configUrl.openStream();
        try {
            // process your input here or in separate method
        } finally {
            input.close();
        }
    }
   
  • Преобразуйте URL в File. Этот подход не рекомендуется, поскольку он предполагает, что Bundle развернут как каталог (а не в архиве). Однако полезно иметь дело с устаревшими библиотеками, которые требуют использования объектов File. Для преобразования в файл вы не можете использовать метод URL.getPath(), потому что Equinox имеет свой собственный формат для URL-адресов. Вы должны использовать класс org.eclipse.core.runtime.FileLocator для разрешения File. FileLocator.getBundleFile(Bundle) делает именно то, что вы хотите.

Ответ 2

Решено!!! Спасибо Данаилу Начеву (см. Комментарий), который привел меня к правильному пути! После некоторого поиска после "bundleentry://xyz" и "bundleresource://" я нашел этот пост в почтовом списке: http://www.mail-archive.com/[email protected]/msg02410.html

Итак, ответ следующий (Using (Equinox) FileLocator):

URL configURL = context.getBundleContext().getBundle().getResource("config.csv");
File configFile = new File(FileLocator.toFileURL(configURL).getPath());

Но (также заданный в этом списке рассылки) было бы интересно, существуют ли другие решения, которые применимы не только для Equinox?