Search code examples
javamoduleosgiapache-felix

How to start and use Apache Felix from code?


I can't find information about starting and using Apache Felix from code.

I want do things which I am able (or unable ;) ) to do with Apache Felix's Shell.

For example, how do I start a module?

Please help.


Solution

  • So, after trying around a lot of time, here's a possible solution.

    We will have two projects:

    • OsgiModuleA, which contains a module-to-be-started
    • OsgiUsage, which will use the "Module A"

    Project OsgiModuleA

    File module/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);
      }
    
    }
    

    File manifest.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
    

    Project OsgiUsage

    File usage/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);
      }
    
    }
    

    Output

    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...