因此,经过很多时间的尝试,这是 一个可能的解决方案 。
我们将有两个项目:
- 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.0X-COMMENT: Main-Class will be added automatically by buildBundle-Name: Module ABundle-Description: Module ABundle-Vendor: meBundle-Version: 1.0.0Bundle-Activator: module.a.Activatorimport-Package: org.osgi.framework
Osgi项目的使用
文件使用情况/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*** stoppeduninstalling bundle file:../OsgiModuleA/dist/OsgiModuleA.jarstopping...



