在我的宿主应用程序中,我尝试实现一个简单的pushService,它 用于将名为Vehicle的类的实例传输到OSGi 世界,通过提供一个集合和获取方法。能够使用我的服务 将服务接口和Vehicle类都导出到jar文件中 在捆绑包中导入该文件,该文件应使用该服务。
每次我尝试在我的宿主应用程序中使用Vehicle类时, 它实现了felix框架和捆绑,我得到了一个联系 错误。阅读以下博客文章后 (http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror-loader-constraint.html) 我理解为什么会出现这种错误。但我不知道如何解决我的问题。
是否可以在主机应用程序和OSGi之间共享一个类 实例?也许我必须使用反射而不是导入jar文件?我查看了那个库(http://code.google.com/p/transloader/),我不确定这个库是否能够解决我的问题......
BR,
马库斯
答案 0 :(得分:3)
有一段时间,我使用Felix完全按照您在自定义客户端 - 服务器应用程序中提出的要求。我已经切换到Equinox(他们正确地实现了我需要的摇摆LAF as os束所需的框架片段)。我 THINK 以下内容适用于Felix,我知道它在Equinox中有效。
更新:我使用我的宿主应用程序开始了一条非常相似的路径。我很早就意识到我需要将尽可能多的代码移动到真正的OSGi包中才能真正利用该平台。我的主机应用程序设置客户端/服务器通信并同步捆绑包;而已。我曾经分享过的几个课程已被转移到捆绑中,我没有回头看。如果您的设计/应用程序可以支持捆绑包中的大部分代码,我肯定会走这条路。即使需要重新设计,也值得。
在初始化OSGi运行时之前,将此属性设置为“org.osgi.framework.system.packages”以包含由分号“;”分隔的包(无通配符)。您可能还需要包括基本osgi包,“org.osgi.framework”和基本服务“org.osgi.packageadmin”,“org.osgi.startlevel”,“org.osgi.url”。
我只是挖掘了我的版本控件并在我还在使用Felix时找到了一个片段(Equinox的设置几乎相同)
Map<String, String> configMap = new HashMap<String, String();
configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
"your.package;other.package;org.osgi.framework");
// setup other properties
Bundle systemBundle = new Felix(configMap, null);
systemBundle.start();
// Now you can use classes from "your.package" with explicity
// declaring them as imports in bundles