我的接口和实现放在一个bundle里
接口代码:
public interface MyService {
public String getHello();
}
实现代码:
import org.osgi.service.component.ComponentContext;
import osgi.service.MyService;
public class MyServiceImpl implements MyService {
protected void activate(ComponentContext context) {
System.out
.println("MyService Component Active,within the bundle lifecircle.");
}
public void deactivate(ComponentContext context) throws Exception {
System.out
.println("MyService Component Deactive,within the bundle lifecircle.");
}
@Override
public String getHello() {
// TODO Auto-generated method stub
return "No Spring OSGI";
}
}
调用实现是另一个bundle
import org.eclipse.osgi.framework.console.CommandProvider;
import osgi.service.MyService;
public class TestOsgi implements CommandProvider{
MyService ms;
public synchronized void setRunnable(MyService r) {
ms = r;
System.out.println(ms.getHello());
System.out.println("This is TestOsgi Declarative Service.");
}
public synchronized void unsetRunnable(MyService r) {
ms = null;
}
@Override
public String getHelp() {
// TODO Auto-generated method stub
return null;
}
}
问题就在调用实现的地方,我必须要实现一个接口(例如CommandProvider),并且在xml文件中体现为service的provider interface。这时候运行就可以看到输出,如果我没有实现接口,运行后可以通过命令ss看到都已经active,但并没有输出,也就是说TestOsgi并没有执行setRunnable方法而且MyServiceImpl也没有执行activate方法。
终于知道了,作为service就必须要实现接口,所以TestOsgi并不是作为service用的,所以可以在bundle的xml中删除service一段,只是作为普通component使用即可。