3

在我的宿主应用程序中,我尝试实现一个简单的 pushService,通过提供 set 和 get 方法,该服务将用于将名为 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,

马库斯

4

1 回答 1

3

有一次,我正在使用 Felix 来完全按照您在自定义客户端-服务器应用程序中的要求进行操作。我已经切换到 Equinox(他们正确地实现了我需要将 Swing LAF 作为 osgi 包的框架片段)。我认为以下内容适用于 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
于 2009-06-18T14:43:26.690 回答