在 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?的主要内容,如果未能解决你的问题,请参考以下文章