Использование SnakeYaml под OSGi?

Работает ли SnakeYaml в среде OSGi? Я изменил МАНИФЕСТ и тому подобное, чтобы он правильно развертывался, но попытка загрузить документ в структуру объекта JavaBean не удалась с исключениями «Класс не найден».

Спасибо.


person oconnor0    schedule 09.02.2011    source источник
comment
Не могли бы вы рассказать команде SnakeYAML, что вы изменили? Для этого есть проблема: code.google.com/p/snakeyaml. /issues/detail?id=96   -  person Andrey    schedule 11.02.2011
comment
Конечно вещь. Я только что опубликовал МАНИФЕСТ, который использую (в основном, потому что мое развертывание немного отличается, но должно работать). Дай мне знать.   -  person oconnor0    schedule 11.02.2011


Ответы (2)


Иногда это так же просто, как добавить заголовки манифеста, чтобы заставить jar хорошо работать в песочнице OSGi. Иногда банки/библиотеки делают "непослушные" вещи в контексте OSGi. Золотое правило состоит в том, чтобы избегать использования «Class.forName()» из-за того, как OSGi использует загрузчики классов, в противном случае это совершенно допустимо в среде загрузчика одного класса. Я перетащил исходный код в SnakeYaml, и загрузчик на основе bean-компонентов использует Class.forName.

Хорошей новостью является то, что, похоже, существует конструктор CustomClassLoaderConstructor, который позволяет вам использовать собственный загрузчик классов, и вы используете его, когда создаете основной объект синтаксического анализатора Yaml. Ключ в том, чтобы получить правильный загрузчик классов. Вы захотите использовать загрузчик классов пакета, в котором вы используете Yaml, НО вам нужно убедиться, что ЛЮБОЙ КЛАСС, который будет создан, импортирован в этот пакет. Импорт гарантирует, что все необходимые объекты находятся в дереве загрузчика классов, которое создает OSGi.

см. этот вопрос для создания загрузчика классов на основе пучок.

person basszero    schedule 09.02.2011
comment
просто интересно, изменится ли Class.forName(name) на Thread.currentThread().getContextClassLoader().loadClass(name); help ? - person maslovalex; 09.02.2011
comment
Ах, я пропустил CustomClassLoaderConstructor. Спасибо. Это то, что я искал. Я импортировал все классы, которые собирался использовать, в этот пакет, а затем передал загрузчик классов (через ObjectName.class.getClassLoader()) в CustomClassLoaderConstructor. - person oconnor0; 10.02.2011

Для тех, кто наткнется на это, более новые версии snakeyaml уже являются комплектом osgi. Не нужно возиться с файлом MANIFEST.MF.

Вы должны просто использовать CustomClassLoaderConstructor следующим образом:

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor;

CustomClassLoaderConstructor constructor = new CustomClassLoaderConstructor(this.getClass().getClassLoader());
Config config = new Yaml(constructor).loadAs(in, Config.class);

Код протестирован с org.yaml.snakeyaml;bundle-version="1.25.0"

person mkdev    schedule 14.10.2019