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过程,这些将在下一篇博文中做具体的讲解。

时间: 2024-10-20 20:43:32

osgi + felix example1编写的相关文章

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

osgi + felix example3编写与使用服务的改进 上一篇博文中我们提及了如何对一个服务进行注册,但在example2和example2b中都没有对这个服务进行相应的使用,在本文中将对这个服务进行使用相应的使用,在felix的官网中,对该服务的使用方法是对目前已经注册的bundle进行扫描,然后使用服务,但是个人觉得Activator这种启动bundle最好只有一个,并且本文搭建了一个完整的环境,部署多个Activator bundle也不现实,因此本文采用了其他方法. 思路 在本文

osgi + felix example2b编写

前一篇博文中我们讲解了OSGI的传统注册式服务与声明式服务,再前一篇我们我们进行了osgi + felix example2的编写,这一篇博文我们编写了一个Bundle和一个接口并对这个接口进行了相应的实现之后,在这个bundle的start方法中进行了该服务的注册,并没有使用这个服务.本文中编写的程序仍然是不使用这个服务,只进行相应的注册,在example3中将会讲解使用这个服务. 程序 程序中变动的只是Activator中一部分内容,具体的程序如下: package cn.com.examp

osgi + felix example2编写

在上次博文中配置了karaf的日志格式输出,在两篇之前的一篇文章编写了基本的felix中的简单的example编写,编写了一个简单的Activator,启动并得到正常的输出,这一篇博文将开始稍微复杂一点的程序编写,将进行一个服务的注册. DictionaryService 首先创建一个interface,命名为DictionaryService,添加以下内容: package cn.com.example2; /** * A simple service interface that defin

全手工快速开发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.BundleActivat

扩展Tomcat支持OSGi应用服务

转自 扩展Tomcat支持OSGi应用服务(1) 扩展Tomcat支持OSGi应用服务(2) 扩展Tomcat支持OSGi应用服务(3) 1.摘要 OSGi的动态服务,包版本管理,安全设施,热插拔等特性吸引了越来越多开发人员的关注,由于OSGi不同于以往的设计理念,在企业级应用中一直没有很大的发挥.不过通过大家的不断努力,OSGi已在企业级服务平台中有所集成.本文站在另一个角度尝试Tomcat服务器下的OSGi服务集成,为web应用提供动态服务,为企业级开发提供参考. 本文需要读者了解以下内容:

SDN实战: Build a mini-lab environment and practice SDN-IP/ONOS with GNS3, Mininet and VMware

SDN IN ACTION: Build a mini-lab environment and practice SDN-IP/ONOS with GNS3, Mininet and VMware    薛国锋  [email protected] 本文主要通过简单的实验,对SDN相关概念以及ONOS开源软件等建立一个感性的印象,加深对核心概念的理解. SDN-IP is to adopt SDN/OpenFlow switches to replace the traditional IP/M

Hello OSGI --- Apache Felix

Apache Felix Felix是一个OSGi版本4规范的Apache实现. OSGi是一个基于Java的服务平台规范,其目标是被需要长时间运行.动态更新.对运行环境破坏最小化的系统所使用.有许多公司(包括Eclipse IDE,它是第一个采用OSGi技术的重要项目)已经使用OSGi去创建其微内核和插件架构,以允许在运行时刻获得好的模块化和动态组装特性.几个其他项目如Apache Directory.Geronimo.Jackrabbit.Spring以及JOnAS也都正在转向采用OSGi.

osgi与流行的框架(spring,struts,hibernate等)的集成

1.与流行的 JAVA B/S体系架构的集成 了解了基于osgi系统设计的基本思想,进一步来研究osgi与流行的框架(spring,struts,hibernate等)的集成,这里首先讲解一下集成原理. l        解决和spring的集成 由于spring的应用占据了大部分的java应用领域,所以解决与spring的集成是osgi必须解决的,spring-dm的推出大大促进了两者的结合,有助于osgi进军企业领域. Spring所带来得好处主要有这么两点: 1.       不需要对外的

OSGI中自定义command(2)

OSGI中自定义command(2) 前文 在上一篇博文中,我们讲述了什么是OSGI中的command,同时写了一个简单的command,这个command实现了org.apache.felix.gogo.commands.Action这个接口,同样可以实现相同功能的还有 org.apache.karaf.shell.console.OsgiCommandSupport这一个抽象类,但是在本程序中,这两个接口或者抽象类上都标注了@Deprecated,因此已经不推荐使用了,而当前推荐使用的则是k