0

我有一个捆绑组件,

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

我该如何解决我的问题?谢谢你。

4

2 回答 2

1

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

为简单起见,您应该使用捆绑包中的工厂服务(和任何其他服务)而不是主机。

如果您确实需要从主机使用它们,则必须配置 OSGi 框架以从 bundle 0 导出所有必需的包。

于 2014-01-29T09:05:44.240 回答
0

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

AClassCastException当一个类无法转换为同名的类时,是由于尝试跨类加载器转换类引起的:这是不可能的,请参见此处

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

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

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

于 2014-01-28T21:24:29.583 回答