osgi + felix example1编写

Posted 叶长风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了osgi + felix example1编写相关的知识,希望对你有一定的参考价值。

在上篇博文中,我们搭建了osgi的整个运行环境,并将其他个别组件也整合了进来用于后续的开发,本播客系列将会将apache felix官网中example全部编写一遍,然后进行osgi后续的文章编写,如osgi command,blueprint,configAdmin等等,这些暂且放置一边,日后写博文的时候再谈。


example模块

在上回建立的maven工程中,新建文件夹命名为Application,日后编写的应用模块都将放在这个文件夹之中,新建maven module 命名为example,选择文件夹为Application,新建完成之后,改pom.xml文件中parent为Parent模块,不选择为root模块。


程序编写

首先确定pom文件中的依赖,将以下内容写入pom文件之中:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-blueprint</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>${cxf.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.4.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-mybatis</artifactId>
            <version>${camel.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- Testing & Camel Plugin -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-test-blueprint</artifactId>
        </dependency>
    </dependencies>

    <build>
        <defaultGoal>install</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Private-Package>cn.com.command.*</Private-Package>
                        <Import-Package>*</Import-Package>
                        <Bundle-Activator>cn.com.example5.Activator</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <configuration>
                    <bootFeatures>
                        <bootFeature>${project.artifactId}</bootFeature>
                    </bootFeatures>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

以上,maven插件中,felix插件是我们所必须使用的,karaf插件是
提供我们运行容器的。其他一些依赖的问题暂时或用不上,后续将讲解这些。
接下来src文件夹下新建Class,命名为Activator,将Apache example1中源码编写进去,为以下:

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;

/**
 * Created by Administrator on 2016/6/18.
 */
public class Activator implements BundleActivator, ServiceListener {

    public void start(BundleContext bundleContext) throws Exception {
        System.out.println("Starting to listen for service events.");
        bundleContext.addServiceListener(this);
    }

    public void stop(BundleContext bundleContext) throws Exception {
        bundleContext.removeServiceListener(this);
        System.out.println("Stopped listening for service events.");
    }

    public void serviceChanged(ServiceEvent serviceEvent) {
        String[] objectClass = (String[])serviceEvent.getServiceReference().getProperty("objectClass");
        if (serviceEvent.getType() == ServiceEvent.REGISTERED) {
            System.out.println("Ex1: Service of type " + objectClass[0] + " registered.");
        } else if (serviceEvent.getType() == ServiceEvent.UNREGISTERING) {
            System.out.println("Ex1: Service of type " + objectClass[0] + " unregistered.");
        } else if (serviceEvent.getType() == ServiceEvent.MODIFIED) {
            System.out.println("Ex1: Service of type " + objectClass[0] + " modified.");
        }
    }
}

然后改变pom.xml中felix插件中中类,启动类改写为当前编写的example类的所在包名与类名。


example feature

在上述完成之后,需要另外在配置feature,feature在上篇博客中已经提及,本文中不再讲述,在feature.xml中添加当前example feature,为以下:

<feature name="example" version="${project.version}">
        <feature>http</feature>
        <feature>cxf</feature>

        <feature>camel-core</feature>
        <feature>camel-blueprint</feature>
        <feature>camel-jackson</feature>
        <feature>camel-cxf</feature>

        <bundle>mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-base/2.4.3</bundle>
        <bundle>mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider/2.4.3</bundle>

        <bundle start-level="100">mvn:${project.groupId}/example/${project.version}</bundle>
    </feature>

这里面这些配置的其他feature,都是应用其他做准备的,配置cxf是用来实现restful服务的,jackson是用来序列化使用的,最开始只需配置camel-core和最下的工程bundle即可。

<bundle start-level="100">mvn:${project.groupId}/example/${project.version}</bundle>

这一个是用来将当前工程同样打包为一个bundle使用的,在后续添加子模块时,每一个feature都会添加这行内容。


运行

在mvn 编译, install 之后,intellij中运行karaf插件,如以下:
这里写图片描述

运行karaf-run,会得到以下结果:
这里写图片描述

以上,Activator成功启动并正常运行,即该示例演示成功。


总结

本文对felix官网中example1进行了编写,并成功演示,但并没有讲解其种具体的原理,example的装卸载,还有karaf输出日志中,对各个bundle的install过程,这些将在下一篇博文中做具体的讲解。

以上是关于osgi + felix example1编写的主要内容,如果未能解决你的问题,请参考以下文章

osgi + felix example2编写

osgi + felix example2b编写

osgi + felix example3编写与使用服务的改进

OSGI 与 Apache Felix

Felix/OSGi:如何使用不是 OSGi 服务的 SCR 组件?

如何使用felix实现osgi