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

我无法从代码中找到有关启动使用 Apache Felix的信息。

我想做一些我能够(或无法))与Apache Felix的Shell一起做的事情。

例如,如何启动模块?

请帮忙。

因此,经过大量时间的尝试,这是一个可能的解决方案

我们将有两个项目:

  • 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); } } 

文件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 

项目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 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); } } 

产量

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