Я использую набор инструментов aQute Bnd для создания OSGi-пакета и упакован с некоторыми зависимыми файлами ресурсов. Это включает в себя файлы * .css и * .xsd в каталоге ресурсов, который я создал.
Я включил в файл bundle.bnd следующее:
Include-Resource: resources/=resources/
и когда я делаю сборку, сгенерированный файл * .jar содержит файлы * .css и * .xsd в каталоге ресурсов в верхнем каталоге файла комплекта jar.
Однако в реальном коде я испытываю трудности, пытаясь сослаться на это как на часть моего пути к классам:
Я пробовал следующее:
new File("resources/example.css");
Я также пробовал:
URL cssFile = this.getClass().getResource("resources/example.css");
try
{
file = new File(cssFile.toURI()));
}
catch(Exception e)
{
e.printStackTrace();
}
Я либо получаю сообщение об ошибке NullPointException, либо не удается найти файл IOException (в зависимости от того, какой файл я использую). Я получаю эту ошибку при работе как в Eclipse Equinox в режиме отладочной конфигурации, так и в Apache Felix (который мы используем для нашего развертывания). Обратите внимание, я пытаюсь сделать это в классах Java за пределами BundleActivator.
Нужно ли мне всегда ссылаться на контекст BundleActivator, например ??1020*
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception
{
/* Service to host the Bundle interface. */
ServletContainerService service = new ServletContainerService();
service.addServlet(new ServletContainer(new AxisServlet(), true));
this.serverReg = context.registerService(ServletContainerService.class.getName(), service, null);
cssFile = new File(context.getClass.getResource("resource/example.css"));
}
Я думаю, что вышеприведенное сработает, но будет означать, что мне придется передать ссылку на cssFile, которая не выглядит элегантной.
Есть ли способ сослаться на путь к каталогу 'resources', который включен в jar-файл комплекта в любом данном классе Java, который является частью файла bundle / .jar? Если он включает в себя BundleContext, есть ли способ сослаться на это в любом классе Java?
Любая помощь будет высоко ценится.
Я посмотрел и Включая дополнительные ресурсы с пакетами OSGi , но, похоже, вам нужен BundleContext.
Я мог бы найти возможное решение этой проблемы: http://www.vogella.de/blog/tag/plugin/
Похоже, у Вогеллы есть пример кода для этого:
URL url;
try {
url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");
InputStream inputStream = url.openConnection().getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
Кто-нибудь знает, является ли этот путь тем же, если это не плагин и если я использую различные среды OSGi, например. Равноденствие Затмение против Апача Феликса?
например url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");