意义:直接使用编辑器编辑所需Osgi的服务,速度快、效率高。
OSGI容器:选择knopflerfish_osgi_5.1.0 (http://www.knopflerfish.org/),支持OSGI最新的R5标准。
方法:
1 在当前目录下编写Activator.java文件(不需要建立相应的包文件夹——省事),内容如下(这个参照Felix的tutorial)
package tutorial.example1; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceEvent; /** * This class implements a simple bundle that utilizes the OSGi * framework's event mechanism to listen for service events. Upon * receiving a service event, it prints out the event's details. **/ public class Activator implements BundleActivator, ServiceListener { /** * Implements BundleActivator.start(). Prints * a message and adds itself to the bundle context as a service * listener. * @param context the framework context for the bundle. **/ public void start(BundleContext context) { System.out.println("Starting to listen for service events."); context.addServiceListener(this); } /** * Implements BundleActivator.stop(). Prints * a message and removes itself from the bundle context as a * service listener. * @param context the framework context for the bundle. **/ public void stop(BundleContext context) { context.removeServiceListener(this); System.out.println("Stopped listening for service events."); // Note: It is not required that we remove the listener here, // since the framework will do it automatically anyway. } /** * Implements ServiceListener.serviceChanged(). * Prints the details of any service event from the framework. * @param event the fired service event. **/ public void serviceChanged(ServiceEvent event) { String[] objectClass = (String[]) event.getServiceReference().getProperty("objectClass"); if (event.getType() == ServiceEvent.REGISTERED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " registered."); } else if (event.getType() == ServiceEvent.UNREGISTERING) { System.out.println( "Ex1: Service of type " + objectClass[0] + " unregistered."); } else if (event.getType() == ServiceEvent.MODIFIED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " modified."); } } }
2 编写manifest.mf文件
Manifest-Version: 2.0 Bundle-Name: Service listener example——描述信息,用于查看该Bundle显示的标题) Bundle-Description: A bundle that displays messages at startup and when service events occur——bundle的简短说明信息 Bundle-Vendor: Knopflerfish Bundle-Version: 1.0.0 Bundle-Activator: tutorial.example1.Activator——完整类名,别写错了 Import-Package: org.osgi.framework
rm *.jar mkdir classes javac -d classes -cp ~/knopflerfish_osgi_5.1.0/osgi/framework.jar *.java jar cfm Hello.jar manifest.mf -C ./classes tutorial/example1(Windows下编写build.bat文件,内容相应修改)
说明:
在jar命令行中,Hello.jar文件基本名随意取; ./classes与tutorial/example1之间有空格,表示在classes目录下,将tutorial/example1包下的class文件压缩入包。
4 运行knopflerfish容器
cd ~/knopflerfish_osgi_5.1.0/osgi
java -jar ./framework.jar
然后,将上述3步骤中的Hello.jar拖入窗口bundle区域,ok。
所述方法的好处:完全命令行,不需要借助第三方工具,开发具有敏捷特性。