我将Felix iPOJO封装在我的框架中,称之为"MyFramework",以简化它的一些操作。
使用MyFramework,我有以下内容:
1-"HelloService"捆绑包,这是一个iPOJO组件,提供打印"你好"消息作为服务。
2-"MyFrameworkComposite"捆绑包,它是另一个iPOJO组件,在其启动方法中实例化上面的"HelloService"组件并检索其服务。
3-一个启动器捆绑包,它只是一个OSGI捆绑包,在其启动方法中实例化"MyFrameworkComposite"组件。
4-我的Java应用程序,它加载iPOJO所需的捆绑包,以及以上3个捆绑包。
当我运行我的java应用程序时,我收到以下带有错误的输出:
MyFramework Hello Service Bundle Started!
MyFramework Composite Bundle Started!
MyFramework Starter Bundle Started!
MyFramework Composite Started!
MyFramework Hello Service Component started!!
hello Component copy State is2
[ERROR] : [adere-composite-0] The callback method start has thrown an exception : loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription"
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) previously initiated loading for a different type with name "org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at .....................................(OTHER SIMILAR ERRORS)
done ok (Y)
错误正好发生在以下行:(这一行在我的框架代码中):
public String[] getServiceSpecifications()
{
return this.providedServiceDescription.getServiceSpecifications();//error here
}
providedServiceDescription的类型为providedServiceDescription,它是org.apache.felix.ipojo.handlers.providedservice
包的一部分。
当尝试在我的"MyFrameworkComposite"组件中检索"Hello Service"组件服务时,到达了发生错误的行,如下所示:
ProvidedService ps= content.getProvidedService("myhelloservice.helloservice.HelloService");
我在不同的资源中读到,当您的类路径中有重复的库时,可能会导致这种情况。但我确信事实并非如此。原因是什么?
问题来自OSGi嵌入。OSGi框架内部使用的类和外部使用的类不相同,因为它们的类加载器不同。你应该配置你的框架来避免这个问题与以下两者之一:
- 通过添加额外的系统包(此处为iPOJO包)
- 通过将这些包添加到引导委派
有关问题和解决方法的说明,请参见http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html#ApacheFelixFrameworkLaunchingandEmbedding-主机服务使用