我试图玩OSGi而且我遇到了一个问题...... 我有简单的类FirstVersionPrinter
public class FirstVersionPrinter implements VersionPrinter {
private final static String VERSION = "111";
@Override
public String printVersion() {
return VERSION;
}
}
和界面
public interface VersionPrinter {
public String printVersion();
}
和Locator类
@Override
public String print(Integer version) {
final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
for (Bundle bundle : bundleContext.getBundles()) {
BundleContext bundleContext1 = bundle.getBundleContext();
ServiceReference sr = bundleContext1.getServiceReference(VersionPrinter.class.getName());
...
(1) ((VersionPrinter) bundleContext1.getService(sr)).printVersion());
定位器I中的尝试遍历bundle并为我的VersionPrinter执行printVersion。但是在第(1)行中我得到了ClassCastException
java.lang.ClassCastException: example.FirstVersionPrinter cannot be cast to example.VersionPrinter
有人可以澄清它为什么会发生吗? 感谢。
PS:不同包中的Locator和FirstVersionPrinter
答案 0 :(得分:2)
如果多个包包含包示例,则会发生这种情况。如果两个不同的类加载器加载“相同”类,则java不会认为它是相同的。
因此,请确保理想情况下只在一个包中包含接口类并从那里导出它。所有需要该类的bundle都应该导入这个包。
如果由于某种原因您必须将示例包打包在多个包中,请确保所有这些包在其Manifest中导入和导出包。这样可以确保OSGi只选择其中一个包进行导出,并从所有其他包中导入。
顺便说一下。迭代bundle并向每个BundleContext询问服务引用的方式是不正确的。您只需要使用一个BundleContext并执行context.getServiceReferences来获取所有FirstVersionPrinter服务。