SnakeYaml 是否在 OSGi 框架中工作?我已经修改了 MANIFEST & 这样它才能正确部署,但是尝试将文档加载到 JavaBean 对象结构中失败并出现“找不到类”异常。
谢谢。
有时它就像添加清单头以使 jar 在 OSGi 沙箱中正常运行一样简单。有时 jars/libraries 在 OSGi 的上下文中做“顽皮”的事情。一条黄金法则是避免使用“Class.forName()”,因为 OSGi 使用类加载器的方式,否则在单个类加载器环境中完全有效。我将源代码拉到 SnakeYaml,它们是基于 bean 的加载器,它使用 Class.forName。
好消息是,似乎有一个构造函数 CustomClassLoaderConstructor,让您可以使用自己的类加载器,并在创建核心 Yaml 解析器对象时使用它。关键是获得正确的类加载器。您需要使用正在使用 Yaml 的包的类加载器,但您需要确保将创建的任何类都导入到该包中。导入将确保所有需要的对象都在 OSGi 创建的类加载器树中。
有关基于捆绑包创建的类加载器,请参阅此问题。
对于任何偶然发现这一点的人来说, snakeyaml的新版本已经是一个osgi bundle。无需摆弄文件 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" 测试的代码