Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在OSGi下使用SnakeYaml?_Java_Osgi_Yaml_Snakeyaml - Fatal编程技术网

Java 在OSGi下使用SnakeYaml?

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

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


谢谢。

有时候,只需添加清单头,就可以让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团队您所做的更改吗?这有一个问题:当然可以。我刚刚发布了我使用的清单(主要是因为我的部署略有不同,但应该可以正常工作)。让我知道。