OSGI实战教程【Spring DM】编写一个简单的Bundle组件

OSGI实战教程

关键字: Spring DMFelixKarafServiceMixOSGI

本教程使用相关工具:

  • 1、开发工具:Eclipse
  • 2、依赖管理:Maven
  • 3、OSGI容器:ServiceMix

目标:教程演示使用Maven构建,采用Spring DM开发一个最基本的OSGI组件,并将组件运行于ServiceMix容器中。

1、创建项目:

项目结构
创建一个普通的Maven工程,怎么创建就不累赘了。

2、导入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.micai.test</groupId>
    <artifactId>osgi-hello-liyong</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <name>osgi-hello-liyong</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.12.RELEASE</spring.version>
        <felix.plugin.version>3.2.0</felix.plugin.version>
        <osgi.version>4.2.0</osgi.version>
        <spring.osgi.version>1.2.1</spring.osgi.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-core</artifactId>
            <version>${spring.osgi.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.aop</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.beans</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.aopalliance</groupId>
                    <artifactId>com.springsource.org.aopalliance</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-web</artifactId>
            <version>${spring.osgi.version}</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.aop</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.beans</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>com.springsource.javax.servlet</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.aopalliance</groupId>
                    <artifactId>com.springsource.org.aopalliance</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.osgi</groupId>
            <artifactId>spring-osgi-extender</artifactId>
            <version>${spring.osgi.version}</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.aop</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.beans</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>org.springframework.context</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <target>1.6</target>
                    <source>1.6</source>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>${felix.plugin.version}</version>
                <configuration>
                    <instructions>
                        <Import-Package>
                            *
                        </Import-Package>
                        <Karaf-Commands>*</Karaf-Commands>
                    </instructions>
                </configuration>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>

依赖引入关键点:

  • 2.1、引入maven-bundle-plugin插件
<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>${felix.plugin.version}</version>
    <configuration>
        <instructions>
            <Import-Package>
                *
            </Import-Package>
            <Karaf-Commands>*</Karaf-Commands>
        </instructions>
    </configuration>
    <extensions>true</extensions>
</plugin>

使用这个插件后,我们就不用再配置OSGI相关的描述文件了,所有OSGI的属性该插件已经在打包的时候为我们添加完成,我们只需要开发自己的业务就行了。

  • 2.2、打包类型
<packaging>bundle</packaging>

这点是与我们正常的的项目不同地方,正常项目我们都是配置pom、jar、war等

说明:如果在你的代码中报错:Project build error: Unknown packaging: bundle,那么仅需要在plugin中添加 <extensions>true</extensions> 即可

  • 2.3、引入Spring OSGI相关的依赖包,该依赖配置中排除了spring-osgi中低版本的spring相关jar,手动引入了高版本的spring依赖

3、编写一个简单的Spring Bean

package com.micai.test.osgi.hello;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.stereotype.Service;

@Service
public class HelloWorldService {
    @PostConstruct
    public void init() {
        System.out.println("Bean初始化");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("Bean销毁");
    }
}

4、编写Spring相关配置 spring-context.xml

配置文件名称没有特殊要求,但是放置的位置必须在指定位置
这里写图片描述
必须放置于classpath下面的: META-INF/spring目录中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:osgi="http://www.springframework.org/schema/osgi"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
                        http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">

    <context:component-scan base-package="com.micai.test.osgi.hello" />

</beans>

该出配置没有什么特殊的配置,仅仅配置了包扫描功能。我们的简单组件就开发完成了。

5、打包

直接通过maven命令

mvn install

进行打包安装到本地,这里因为我使用 mvn build打包报错,用install反而好使了,暂时没时间纠结为什么。。。

6、发布

将打好的jar包上传到自己准备好的ServiceMix容器环境的发布目录:
发布目录:在ServiceMix的安装目录中的 deploy文件夹中。
这里写图片描述

karaf@root>Bean初始化
karaf@root>bundle:list | grep "osgi-hello-liyong"
265 | Active   |  80 | 0.0.1.SNAPSHOT                     | osgi-hello-liyong
karaf@root>bundle:stop 265
Bean销毁
karaf@root>bundle:start 265
karaf@root>Bean初始化

当上传成功后,组件就自动重启了,即spring容器也初始化了,由于我们直接使用打印命令打印内容到控制台了,那么在我们的ServiceMix的控制台上面就可以看到Bean初始化时打印的消息。
当我们使用相关命令停止该bundle时,spring容器被销毁了,bean也就销毁了,所以执行了我们bean配置中的销毁方法。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值