Работает ли SnakeYaml в среде OSGi? Я изменил МАНИФЕСТ и тому подобное, чтобы он правильно развертывался, но попытка загрузить документ в структуру объекта JavaBean не удалась с исключениями «Класс не найден».
Спасибо.
Работает ли SnakeYaml в среде OSGi? Я изменил МАНИФЕСТ и тому подобное, чтобы он правильно развертывался, но попытка загрузить документ в структуру объекта JavaBean не удалась с исключениями «Класс не найден».
Спасибо.
Иногда это так же просто, как добавить заголовки манифеста, чтобы заставить jar хорошо работать в песочнице OSGi. Иногда банки/библиотеки делают "непослушные" вещи в контексте OSGi. Золотое правило состоит в том, чтобы избегать использования «Class.forName()» из-за того, как OSGi использует загрузчики классов, в противном случае это совершенно допустимо в среде загрузчика одного класса. Я перетащил исходный код в SnakeYaml, и загрузчик на основе bean-компонентов использует Class.forName.
Хорошей новостью является то, что, похоже, существует конструктор CustomClassLoaderConstructor, который позволяет вам использовать собственный загрузчик классов, и вы используете его, когда создаете основной объект синтаксического анализатора Yaml. Ключ в том, чтобы получить правильный загрузчик классов. Вы захотите использовать загрузчик классов пакета, в котором вы используете Yaml, НО вам нужно убедиться, что ЛЮБОЙ КЛАСС, который будет создан, импортирован в этот пакет. Импорт гарантирует, что все необходимые объекты находятся в дереве загрузчика классов, которое создает OSGi.
см. этот вопрос для создания загрузчика классов на основе пучок.
Class.forName(name)
на Thread.currentThread().getContextClassLoader().loadClass(name);
help ?
- person maslovalex; 09.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"