如何从代码中启动和使用 Apache Felix?

Posted

技术标签:

【中文标题】如何从代码中启动和使用 Apache Felix?【英文标题】:How to start and use Apache Felix from code? 【发布时间】:2010-12-25 15:50:34 【问题描述】:

我在代码中找不到有关启动使用 Apache Felix的信息。

我想用 Apache Felix 的 Shell 做我能够(或不能;)) 做的事情。

例如,如何启动一个模块?

请帮忙。

【问题讨论】:

关于这个问题的完整答案,你们可以参考这个example(感谢 killbill 团队)。 【参考方案1】:

所以,在尝试了很多时间之后,这里有一个可能的解决方案

我们将有两个项目:

OsgiModuleA,其中包含一个待启动的模块 OsgiUsage,它将使用“模块 A”

项目 OsgiModuleA

文件模块/a/Activator.java

package module.a;

import org.osgi.framework.*;

public class Activator
    implements BundleActivator, ServiceListener 

  @Override
  public void start(BundleContext bc)
      throws Exception 

    System.out.println("*** started");
    bc.addServiceListener(this);
  

  @Override
  public void stop(BundleContext bc)
      throws Exception 

    bc.removeServiceListener(this);
    System.out.println("*** stopped");
  

  @Override
  public void serviceChanged(ServiceEvent se) 
    String s;

    switch (se.getType()) 
      case ServiceEvent.MODIFIED:
        s = "modified";
        break;
      case ServiceEvent.REGISTERED:
        s = "registered";
        break;
      case ServiceEvent.UNREGISTERING:
        s = "unregistered";
        break;
      default:
        s = "unknown";
    

    System.out.println("= = = service changed: " + s);
  


文件清单.mf

Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Bundle-Name: Module A
Bundle-Description: Module A
Bundle-Vendor: me
Bundle-Version: 1.0.0
Bundle-Activator: module.a.Activator
Import-Package: org.osgi.framework

项目 OsgiUsage

文件使用/Main.java

package usage;

import java.util.*;
import org.apache.felix.framework.*;
import org.apache.felix.framework.util.*;
import org.osgi.framework.*;

public class Main 

  static class HostActivator
      implements BundleActivator 

    private BundleContext context = null;

    @Override
    public void start(BundleContext bc) 
      context = bc;
    

    @Override
    public void stop(BundleContext bc) 
      context = null;
    

    public BundleContext getContext() 
      return context;
    

  

  public static void main(String[] args)
      throws Exception 

    Map<String, Object> map = new HashMap<String, Object>();

    map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
        "some.module.i.dont.know; version=1.0.0");

    HostActivator activator = new HostActivator();

    List<Object> list = new LinkedList<Object>();
    list.add(activator);
    map.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);

    Felix f = new Felix(map);

    System.out.println("starting OSGI...");
    f.start();

    Bundle b = f.getBundleContext().installBundle(
        "file:../OsgiModuleA/dist/OsgiModuleA.jar"); // dirty path ;)
    String bName = b.getLocation();

    System.out.println("starting bundle " + bName);
    b.start();

    Set<String> inUse = new HashSet<String>();
    for (ServiceReference sr : f.getServicesInUse()) 
      inUse.add(sr.toString());
    
    for (ServiceReference sr : f.getRegisteredServices()) 
      String flag = (inUse.contains(sr.toString()) ? "[in use]" : "[      ]");
      System.out.println("+ registered service: " + flag + " " + sr.toString());
    

    System.out.println("stopping bundle " + bName);
    b.stop();

    System.out.println("uninstalling bundle " + bName);
    b.uninstall();

    System.out.println("stopping...");
    f.stop();
    f.waitForStop(1000);
  


输出

starting OSGI...
starting bundle file:../OsgiModuleA/dist/OsgiModuleA.jar
*** started
+ registered service: [in use] [org.osgi.service.startlevel.StartLevel]
+ registered service: [      ] [org.osgi.service.packageadmin.PackageAdmin]
stopping bundle file:../OsgiModuleA/dist/OsgiModuleA.jar
*** stopped
uninstalling bundle file:../OsgiModuleA/dist/OsgiModuleA.jar
stopping...

【讨论】:

“为什么我的服务没有出现”:那是什么服务?在您显示的代码中,您没有注册任何服务。 请为“如何在 OSGi 中注册服务”打开一个新问题。 创建新问题:***.com/questions/1893116/… 标记为正确,因为问题是关于 startingusing Apache Felix。

以上是关于如何从代码中启动和使用 Apache Felix?的主要内容,如果未能解决你的问题,请参考以下文章

在 IntelliJ IDEA 11 中运行 Apache Felix 4.0.2

OSGi 捆绑包未启动:缺少要求 osgi.wiring.package; > &(osgi.wiring.package=org.apache.felix.dm)

如何在 apache felix 上实现异步处理?

OSGi 纲要 (R6) 注释 + Felix SCR 2.0.0 + Karaf 3.0.6

Felix Scr 更改日志级别

如何将 web 应用程序部署到 Apache Felix?