我有一个捆绑组件,
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。然后,我尝试使用Factory Service创建上述组件的实例,如下所示:
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导出所有必需的软件包。
关于java - org.apache.felix.ipojo.ComponentFactory无法转换为org.apache.felix.ipojo.Factory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21398859/