org.apache.felix.ipojo.ComponentFactory不能转换为org.apache.felix.ipojo.Factory

问题描述:

我有一个捆绑组件,org.apache.felix.ipojo.ComponentFactory不能转换为org.apache.felix.ipojo.Factory

package ipojo; 

import ipojo.service.Hello; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Invalidate; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.apache.felix.ipojo.annotations.Validate; 


    @Component(name="hello-factory") 
    @Provides 
    public class HelloImpl implements Hello{ 

     @Override 
     public void shoutHello() { 

      System.out.println("HellooOOOOoooOooo!"); 

     } 


     @Validate 
     public void start() throws Exception { 

      System.out.println("Hello started :)"); 

     } 

     @Invalidate 
     public void stop() throws Exception { 

      System.out.println("Hello Stopped :("); 

     }  

    } 

在我的Java应用程序,我嵌入式Apache菲利克斯,并部署iPOJO APIs。于是,我试图创建一个使用工厂服务我的上述组件的一个实例,如下所示:

myBundle= context.installBundle("myBundlePath"); 
    myBundle.start(); 


    ServiceReference[] references = myBundle.getBundleContext().getServiceReferences(Factory.class.getName(), "(factory.name=hello-factory)"); 

    if (references == null) { 
    System.out.println("No references!"); 
    } 

    else { 
    System.out.println(references[0].toString()); 
    Factory factory = myBundle.getBundleContext().getService(references[0]); 
    ComponentInstance instance= factory.createComponentInstance(null); 
    instance.start(); 

    } 

我顺利拿到了参考厂家的服务,但在下面一行:

Factory factory = myBundle.getBundleContext().getService(references[0]); 

我得到以下ClassCastException异常:

java.lang.ClassCastException: org.apache.felix.ipojo.ComponentFactory cannot be cast to org.apache.felix.ipojo.Factory` 

我改变了这一行:

Factory factory = (ComponentFactory) myBundle.getBundleContext().getService(references[0]); 

后来我:

java.lang.ClassCastException: org.apache.felix.ipojo.ComponentFactory cannot be cast to org.apache.felix.ipojo.ComponentFactory 

我怎样才能解决我的问题?谢谢。

嵌入Felix(或任何其他OSGi框架)时,您将在类加载器之间创建一个边界。主机和软件包不使用相同的类加载器,这意味着来自内部和外部的类不兼容。换句话说,从主机访问OSGi服务特别复杂,需要使用反射。

出于简单的原因,您应该使用包中的Factory服务(以及任何其他服务)而不是来自主机。

如果你真的需要从主机中使用它们,您必须配置OSGi框架将所有需要的软件包捆绑从0

+0

谢谢Clement。捆绑0是什么意思?你的意思是使用Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA导出我的主机应用程序中的软件包? – user3243330

+0

将我的代码移到OSGI包为我工作。但我有兴趣从我的主机上使用它。因此,准确输出什么?以及为什么这个解决方案可行? – user3243330

+0

使用上述解决方案。在我的主机中,我将Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA设置为可以在地球上找到的所有ipojo包。但是,我也遇到了同样的错误。 java.lang.ClassCastException:org.apache.felix.ipojo.ComponentFactory无法转换为org.apache.felix.ipojo.Factory' –

此异常意味着存在类路径问题,因为类路径中存在多个库版本。

A ClassCastException当某个类不能转换为同名类时,是由于尝试在类加载器中投射类造成的:这是不可能的,请参阅here

加载类的类加载器成为类唯一标识符的一部分。

因此,如果它们加载到不同的类加载器中,那么具有完全相同名称org.apache.felix.ipojo.ComponentFactory的两个类将不会相同。

您需要调试您的类路径,找到包含该类的库的不需要的版本并将其删除。

+0

我的类路径看起来干净的出口。我只有felix.jar和org.apache.felix.ipojo-1.6.0.jar作为库。还有什么问题可以解决? – user3243330

+0

看看类身份危机http://www.ibm.com/developerworks/java/library/j-dyn0429/并调试寻找包含ComponentFactory的两个jar的类路径。在某处肯定有两个版本的ComponentFactory,因为它是你显示的最后一个ClassCastException的唯一解释,希望这有助于。 –