Нет доступа к Bundle Resource / File (OSGi) - PullRequest
11 голосов
/ 05 июня 2011

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

Bundle-ClassPath: .,
 configuration/data/

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

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

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

Ответы [ 2 ]

13 голосов
/ 06 июня 2011

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

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

Таким образом, ответ следующий (Использование FileLocator (Равноденствие)):

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

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

...