#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. Спасибо, ребята, проблема была с путем 🙂