在 OSGi 下使用 SnakeYaml?

Posted

技术标签:

【中文标题】在 OSGi 下使用 SnakeYaml?【英文标题】:Using SnakeYaml under OSGi? 【发布时间】:2011-06-23 20:19:01 【问题描述】:

SnakeYaml 是否在 OSGi 框架中工作?我已经修改了 MANIFEST & 这样它才能正确部署,但是尝试将文档加载到 JavaBean 对象结构中失败并出现“找不到类”异常。

谢谢。

【问题讨论】:

您能告诉 SnakeYAML 团队您所做的更改吗?它有一个问题:code.google.com/p/snakeyaml/issues/detail?id=96 当然。我刚刚发布了我使用的清单(主要是因为我的部署略有不同,但应该可以工作)。告诉我。 【参考方案1】:

有时它就像添加清单头以使 jar 在 OSGi 沙箱中正常运行一样简单。有时 jars/libraries 在 OSGi 的上下文中做“顽皮”的事情。一条黄金法则是避免使用“Class.forName()”,因为 OSGi 使用类加载器的方式,否则在单个类加载器环境中完全有效。我将源代码拉到 SnakeYaml,它们是基于 bean 的加载器,使用 Class.forName。

好消息是,似乎有一个构造函数 CustomClassLoaderConstructor,让您可以使用自己的类加载器,并在创建核心 Yaml 解析器对象时使用它。关键是获得正确的类加载器。您需要使用正在使用 Yaml 的包的类加载器,但您需要确保将创建的任何类都导入到该包中。导入将确保所有需要的对象都在 OSGi 创建的类加载器树中。

See this question 用于创建基于捆绑包的类加载器。

【讨论】:

只是想知道Class.forName(name) 是否会更改为Thread.currentThread().getContextClassLoader().loadClass(name); 帮助? 啊,我错过了 CustomClassLoaderConstructor。谢谢。这就是我一直在寻找的。我已将我打算使用的所有类导入到该包中,然后将类加载器(通过 ObjectName.class.getClassLoader())传递给 CustomClassLoaderConstructor。【参考方案2】:

对于偶然发现这一点的任何人,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" 测试的代码

【讨论】:

以上是关于在 OSGi 下使用 SnakeYaml?的主要内容,如果未能解决你的问题,请参考以下文章

包含对象列表的 SnakeYaml 反序列化类

SnakeYaml 中的多态集合

使用 SnakeYAML 的嵌套构造

在有或没有 OSGi 的情况下使用 JPA 的区别

Snakeyaml - 如何对流样式进行自定义控制

使用 SnakeYaml 解析时忽略来自 yaml 的字段(无法在类上找到属性)