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

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

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


person Zitzit    schedule 05.06.2011    source источник
comment
Можете ли вы опубликовать код, который получает URL-адрес ресурса и то, как вы его используете впоследствии. Когда вы используете getEntry(), вы должны передать конфигурацию/данные/config.csv в качестве параметра для getEntry(). Результирующий URL-адрес будет иметь формат: bundleentry://20.fwk1235/resource.txt. Кажется невозможным, что он будет иметь формат, который вы опубликовали. Итак, происходит что-то одно, что непонятно из вашего вопроса.   -  person Danail Nachev    schedule 06.06.2011
comment
Вы правы извините. Вывод URL configURL = context.getBundleContext().getBundle().getEntry("configuration/data/confid.csv"); — это bundleentry://6.fwk33311724/configuration/data/config.csv. Я пытаюсь преобразовать URL-адрес в файл через: File configFile = new File(configURL.getPath());. Выходной путь configFile.getAbsolutePath(); чем: D:\configuration\data\config.csv   -  person Zitzit    schedule 06.06.2011


Ответы (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) делает именно то, что вам нужно.
person Danail Nachev    schedule 06.06.2011
comment
Хорошо спасибо! Несколько вопросов по этому поводу: Я предлагаю ознакомиться с разницей между getEntry(), getResource() и getDataFile(). У вас есть ссылки/руководства/учебники, где описаны эти различия? Более того, есть ли возможность автоматически помещать некоторые каталоги (например, configuration/data/) в каталог конфигурации osgi, как это делается для org.eclipse.osgi (configuration/org.eclipse.osgi/bundles/XX)? --› что-то вроде конфигурации/org.mybundle/data/config.csv. - person Zitzit; 06.06.2011
comment
@Zitzit - я не знаю ни о каких таких руководствах, я в основном полагаюсь на javadoc OSGi API (osgi.org/javadoc/r4v43), где подробно объясняется, что делает каждый метод. Почему вы хотите поместить некоторые каталоги в каталог osgi-configuration (который, как я полагаю, является конфигурацией/папкой Equinox)? Эта папка специфична для Equinox, поэтому ее использование должно быть ограничено, иначе вы станете зависимым от Equinox. - person Danail Nachev; 06.06.2011

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

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

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

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

person Zitzit    schedule 06.06.2011
comment
Было бы лучше, если бы вы проголосовали за ответ Данила Начева. Кроме того, вместо того, чтобы добавлять еще один ответ на ваш вопрос, в котором говорится, что такое решение, было бы лучше, если бы вы отредактировали исходный вопрос и добавили решение под вопросом. - person jfenwick; 07.06.2011
comment
stackoverflow.com/questions/4538898/ Вот хороший пример того, как изменить свой вопрос, чтобы было легче найти решение. - person jfenwick; 07.06.2011
comment
@jfenwick - мне интересно, почему ты так думаешь. blog.stackoverflow.com/2011/07/ прямо говорит, что правильно ответить на ваш вопрос самостоятельно. - person James Moore; 15.01.2012