Нет доступа к Bundle Resource/File (OSGi)

В настоящее время я разрабатываю основанное на OSGi WebApp с Jetty и Equinox (см.: http://wiki.eclipse.org/Jetty/Tutorial/EclipseRT-Jetty-Starter-Kit). Пока все нормально, но я не могу получить доступ к некоторым файлам / ресурсам из моего собственного пакета. Расположение / путь это "конфигурация / данные / config.csv" и "конфигурация / данные / 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". Кроме того, я добавил папки в classpath 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"/>

У кого-то есть идея / совет или что-то еще? Я схожу с ума...

2 ответа

Решение

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

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

Два способа их использования:

  1. открыто 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();
        }
    }
   
  1. Преобразовать URL в File, Этот подход не рекомендуется, поскольку он предполагает, что Bundle развернут как каталог (а не в архиве). Однако полезно, если вам приходится иметь дело с устаревшими библиотеками, которые требуют использования File объекты. Для преобразования в файл вы не можете использовать URL.getPath() метод, потому что Equinox имеет свой собственный формат для URL-адресов. Вы должны использовать org.eclipse.core.runtime.FileLocator класс для разрешения на File, FileLocator.getBundleFile(Bundle) делает именно то, что вы хотите.

Решено!!! Спасибо Danail Nachev (см. Комментарий), который привел меня на правильный путь! После некоторых поисков по "bundleentry://xyz" и "bundleresource://" я нашел этот пост в списке рассылки: http://www.mail-archive.com/felix-dev@incubator.apache.org/msg02410.html

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

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

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

Другие вопросы по тегам