org.apache.felix.ipojo.com.ponent -factory不能被施放到org.apache.f



我有一个捆绑组件,

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 Felix,并部署了IPOJO API。然后,我尝试使用出厂服务来创建上述组件的实例,如下:

    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框架)时,您会在classloaders之间创建边界。主机和捆绑包并不使用相同的类负载器,这意味着从内部和外部的类不兼容。换句话说,从主机访问OSGI服务特别复杂,需要使用反射。

出于简单原因,您应该使用捆绑包而不是从主机中使用出厂服务(以及任何其他服务)。

如果您确实需要从主机中使用它们,则必须配置OSGI框架以导出捆绑包0的所有必需软件包。

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

ClassCastException当一个类别不能施放给同名类是由试图施放类class classloaders引起的:不可能这样做引起的,请参见此处。

加载类的类载荷器使类独特的标识符成为一部分。

因此,如果在不同的类负载器中加载的位置,则具有完全相同名称的两个类别org.apache.felix.ipojo.ComponentFactory的类别不会相同。

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

相关内容

  • 没有找到相关文章

最新更新