Java 在OSGi下使用SnakeYaml?
SnakeYaml是否在OSGi框架内工作?我修改了MANIFEST&这样它就可以正确部署,但是尝试将文档加载到JavaBean对象结构中失败了,出现了“未找到类”异常Java 在OSGi下使用SnakeYaml?,java,osgi,yaml,snakeyaml,Java,Osgi,Yaml,Snakeyaml,SnakeYaml是否在OSGi框架内工作?我修改了MANIFEST&这样它就可以正确部署,但是尝试将文档加载到JavaBean对象结构中失败了,出现了“未找到类”异常 谢谢。有时候,只需添加清单头,就可以让jar在OSGi沙箱中运行良好。有时JAR/库在OSGi的上下文中做一些“顽皮”的事情。由于OSGi使用类加载器的方式,黄金法则是避免使用“Class.forName()”,否则在单个类加载器环境中完全有效。我把源代码拉到SnakeYaml,它们是基于bean的加载程序,使用Class.fo
谢谢。有时候,只需添加清单头,就可以让jar在OSGi沙箱中运行良好。有时JAR/库在OSGi的上下文中做一些“顽皮”的事情。由于OSGi使用类加载器的方式,黄金法则是避免使用“Class.forName()”,否则在单个类加载器环境中完全有效。我把源代码拉到SnakeYaml,它们是基于bean的加载程序,使用Class.forName 好消息是,似乎有一个构造函数CustomClassLoaderConstructor,让您使用自己的类加载器,在创建核心Yaml解析器对象时使用它。关键是获得正确的类装入器。您需要使用使用Yaml的包的类加载器,但需要确保将要创建的任何类都导入到该包中。导入将确保所有需要的对象都位于OSGi创建的类加载器树中
对于基于捆绑包创建的类加载器。对于偶然发现此问题的任何人,较新版本的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”只是想知道将
Class.forName(名称)
更改为Thread.currentThread().getContextClassLoader().loadClass(名称)代码>帮助?啊,我错过了CustomClassLoaderConstructor。谢谢这就是我要找的。我已经将我打算使用的所有类导入到该捆绑包中,然后将类加载器(通过ObjectName.class.getClassLoader())传递到CustomClassLoaderConstructor。您能告诉SnakeYAML团队您所做的更改吗?这有一个问题:当然可以。我刚刚发布了我使用的清单(主要是因为我的部署略有不同,但应该可以正常工作)。让我知道。