首页 > 代码库 > 全手工快速开发osgi应用的方法

全手工快速开发osgi应用的方法

意义:直接使用编辑器编辑所需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

3 编写build.sh文件,内容为:

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。


所述方法的好处:完全命令行,不需要借助第三方工具,开发具有敏捷特性。


全手工快速开发osgi应用的方法