【发布时间】:2012-07-09 22:11:46
【问题描述】:
我有一个运行 Equinox 框架的类。现在我想获得一个由框架外的服务返回的对象(在其中一个包中定义)。
不幸的是,我得到了一个 LinkageError 并且不知道如何摆脱它。是否有可能让服务返回一个合适的对象给非捆绑代码?
这是完整的故事:
ParserDTOBundle 是一个捆绑包,它定义了 ParserDTO 类并导出了相应的包。
在另一个包 ParserServiceBundle 中,我定义了一个名为 ParserService 的服务。此捆绑包导入 ParserDTO 的包。 ParserService 的函数 getDTO() 创建一个新的 ParserDTO 对象并返回它。
现在我创建了另一个类,它启动 Equinox 框架并从目录加载两个包:
...
EclipseStarter.setInitialProperties(frameworkPropertiesMap);
bundleContext = EclipseStarter.startup(new String[] { "-console", "-dev", "bin" }, null);
bundleContext.installBundle("file:/" + dir + "ParserDTOBundle-0.0.1-SNAPSHOT.jar");
Bundle service = bundleContext.installBundle("file:/" + dir + "ParserServiceBundle-0.0.1-SNAPSHOT.jar");
service.start();
ServiceReference serviceReference = bundleContext.getServiceReference(ParserService.class.getName());
if (serviceReference != null) {
ParserService ps = (ParserService) bundleContext.getService(serviceReference);
if (ps != null) {
ParserDTO dto = ps.getDTO();
System.out.println(dto.getValue());
}
}
上述类是非捆绑 Maven 项目的一部分。 上述类的运行失败:
Exception in thread "main" java.lang.LinkageError: loader constraint violation: loader (instance of sun/misc/Launcher$AppClassLoader) previously initiated loading for a different type with name "de/ParserDTO"
有趣的是,我在 System.out.println 而不是之前的行中收到此错误。 我的主类中ParserDTO类的类加载器与对象dto的类加载器明显不同。
如何获取存储在 dto 中的信息?这甚至可能吗? 我是否必须 1.) 将我的普通类加载器交给捆绑包,或者 2.) 使用基本数据类型,或者 3.) 完全以其他方式??
提前谢谢大家! 塞巴斯蒂安
【问题讨论】:
标签: java osgi classloader bundle equinox