繁体   English   中英

嵌入式OSGi:访问动态加载的包组件

[英]Embedded OSGi: accessing dynamically loaded bundle components

在将OSGi嵌入到应用程序/库中,在运行时加载捆绑软件然后在主机应用程序/库中使用该捆绑软件时,我有些迷惑。

这是从我的主机加载捆绑软件的代码:

// framework is the embedded OSGi framework
Bundle b = framework.getBundleContext().installBundle( "file:/project_dir/bundle/MyBundle.jar" );
b.start();

捆绑包含非常简单的内容:

public class Activator implements BundleActivator
{
  @Override
  public void start( BundleContext context )
  {
  }

  @Override
  public void stop( BundleContext context )
  {
  }

  public String shout()
  {
    return "let it all out";
  }
}

如何从主机应用程序访问shout()方法?

简而言之:

  • 将对象注册为OSGi服务
  • 在启动嵌入式OSGi容器的应用程序/库中获取OSGi服务

更详细的解决方案:

  • 在包含shout()函数的单独jar中定义一个接口
  • 将jar文件放在应用程序/库的类路径中
  • 在包的Activator类中实现接口
  • 根据接口将Activator类的实例注册为OSGi服务
  • 在应用程序/库中,基于接口获取OSGi服务

或者,如果您在应用程序/库中没有该接口,则仍然可以获取OSGi服务并使用反射调用该函数。

以下是有关在先前答案之后使用的代码的一些详细信息:

  • 包含您的方法的接口。

     public interface MyInterface { String shout(); } 

    您可能会注意到,为库提供两个捆绑是一个好方法:一个捆绑用于接口,另一个捆绑用于实现。 当实现包再次出现时,它将防止出现“刷新包”问题。

  • 上一个接口的实现:

     public class MyImpl implements MyInterface { public String shout() { return "let it all out"; } } 

    该实现的包不需要通过捆绑包导出。 服务使用者不会直接使用MyImpl类。

  • 激活器的新代码:

     public class Activator implements BundleActivator { private ServiceRegistration serviceRegistration; @Override public void start( BundleContext context ) { this.serviceRegistration = context.registerService( MyInterface.class, new MyImpl(), new HashMap<String,String>()); } @Override public void stop( BundleContext context ) { if (serviceRegistration!=null) { serviceRegistration.unregister(); } } } 

    包含激活器和实现的捆绑软件需要将接口的包导入其文件MANIFEST.MF 激活程序的包或实现都不需要在此文件中导出。 它们必须保持在捆绑包内部。

  • 使用另一个捆绑软件中的服务的类

     public void callService() { ServiceReference<MyInterface> reference = bundleContext.getServiceReference(MyInterface.class); MyInterface foo = bundleContext.getService(reference); try { //use service String msg = service.shout(); } finally { bundleContext.ungetService( reference ); } } 

    您会注意到,使用者仅需要导入接口的包(而不是实现的包)。 此外,您需要小心处理OSGi的动态。 该服务可能在两次通话之间就消失了!

希望对您有帮助,蒂埃里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM