¿Cómo iniciar y usar Apache Felix desde el código?

No puedo encontrar información sobre cómo iniciar y usar Apache Felix desde el código.

Quiero hacer cosas que yo pueda (o no pueda ) hacer con la shell de Apache Felix.

Por ejemplo, ¿cómo comienzo un módulo?

Por favor ayuda.

Entonces, después de probar mucho tiempo, aquí hay una posible solución .

Tendremos dos proyectos:

  • OsgiModuleA , que contiene un módulo para ser iniciado
  • OsgiUsage , que usará el “Módulo A”

Proyecto OsgiModuleA

Módulo de archivo / 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); } } 

Archivo 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 

Proyecto OsgiUsage

Uso de archivo / 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 map = new HashMap(); map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "some.module.i.dont.know; version=1.0.0"); HostActivator activator = new HostActivator(); List list = new LinkedList(); 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 inUse = new HashSet(); 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); } } 

Salida

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