Плагин OSGI получает доступ к файлу в resources.jar

#java #eclipse #resources #osgi #osgi-bundle

#java #затмение #Ресурсы #osgi #osgi-bundle

Вопрос:

Я должен изменить существующее приложение, чтобы оно действовало как плагин OSGI, я наткнулся на следующую проблему. Это приложение зависит от xml файла, который находится в jar файле, это приложение также загружает этот файл во время выполнения, и из-за этого в среде OSGI он недоступен. Любое предложение, как я могу исправить эту проблему, до сих пор я пробовал следующее решение, ни одно из которых пока не дало никаких положительных результатов.

Вот как изначально он был загружен

 InputStream templateInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("resources/template.xml");
 

Я попытался сделать это следующим образом

 URL url = null;
try {
  url = new URL("file:/lib/resources.jar");
} catch (MalformedURLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
URL[] urls = {url};
URLClassLoader classLoader = new URLClassLoader(urls, DeclareMapFactory.class.getClassLoader());
Thread.currentThread().setContextClassLoader(classLoader);
InputStream templateInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("resources/template.xml");
 

Это тоже была попытка

 InputStream templateInputStream = this.getClass().getClassLoader().getResourceAsStream("resources/template.xml");
 

Файл Jar находится в lib каталоге и загружается через MANIFEST.MF

Комментарии:

1. Можете ли вы точно объяснить, где находится XML-файл? Это внутри пакета, который вы развертываете, или в отдельном resources.jar ?

2. @ChristianSchneider, xml находится в resources.jar файл, который находится в папке библиотеки пакета и на который ссылается манифест: Bundle-ClassPath: lib/resources.jar

Ответ №1:

Итак, давайте предположим template.xml находится по адресу resources/template.xml в банке resources.jar . Этот jar находится внутри вашего пакета и ссылается с помощью Bundle-ClassPath .

В этом случае содержимое jar ресурсов должно быть добавлено в classpath вашего пакета.

Итак, когда вы находитесь внутри класса пакета, вы должны быть в состоянии сделать:

 this.getClass().getClassLoader().getResourceAsStream("resources/template.xml")
 

Если это не сработает, возможно, вам нужно начать путь с «/», но я думаю, что он должен работать без.

Комментарии:

1. Я предпочитаю шаблон кода MyClass.class.getResourceAsStream("/resources/template.xml") . Использование литерала класса безопаснее, чем this.getClass() потому, что, если класс когда-либо будет подклассом в другом пакете, он this не будет того типа, который вы ожидаете, и загрузчик классов (и, следовательно, видимые ресурсы) может быть другим.

2. Спасибо, ребята, проблема была с путем 🙂