Нет доступа к 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-адреса, это означает, что ресурс правильно расположен и проблема заключается в том, как вы их читаете.
Два способа их использования:
- открыто
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)
делает именно то, что вы хотите.
Решено!!! Спасибо 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?