spring-dm开发简单的绑定

记录一下使用spring-dm、eclipse、maven创建绑定的步骤。

使用环境

  • jdk 1.6.0_07;
  • eclipse 3.4;
  • maven 2.0.9;
  • spring 2.5.5;
  • spring dm 1.1.2。


具体步骤

安装m2eclipse

http://m2eclipse.codehaus.org/update/

通过help>software updates…在线安装。

只需安装maven integration即可,不需要安装optional components。

创建maven项目

下面是创建完成的效果,项目名称helloworldService:

1

转换为plug-in项目

2

在转换后项目中增加的内容:

3

第一次运行

第一次运行,通过如下方式:

4

运行后,控制台可能打印一些异常,类似下面的BundleException:

5

不过不影响使用,使用ss命令,后面跟项目名称,查看绑定的状态:

6

虽然是空的项目,但是却表示一个绑定,而且当前处于active状态。

创建新的运行配置

上面的运行,默认带了很多不相干的eclipse绑定,而且有些是不可用的。重新创建一个简化的可用的运行配置并再次运行helloworldService绑定。

7

然后创建新的osgi framework运行配置:

8

在对话框更新如下标示内容:

9

这回运行不再报错了。 可以看到,只有两个绑定,一个是eclipse osgi,另一个是helloworldService。

设置maven,导入对spring的库依赖

在pom.xml文件中增加如下内容,主要是导入对spring相关库的依赖以及为了导入这些库需要的仓库。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>2.5.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>2.5.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>2.5.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>2.5.5</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestFile>META-INF/MANIFEST.MF
                    </manifestFile>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
<pluginRepositories>
    <pluginRepository>
        <id>maven-repo</id>
        <name>maven repo</name>
        <url>http://repo1.maven.org/maven2/
        </url>
    </pluginRepository>
    <pluginRepository>
        <id>agilejava</id>
        <url>http://agilejava.com/maven/</url>
    </pluginRepository>
</pluginRepositories>
<repositories>
    <repository>
        <id>eclipse-repository</id>
        <name>Eclipse Repository</name>
        <url>http://repo1.maven.org/eclipse/
        </url>
    </repository>
    <repository>
        <id>safehaus-repository</id>
        <name>Safehaus Repository</name>
        <url>http://m2.safehaus.org</url>
    </repository>
    <repository>
        <id>spring-ext</id>
        <name>Spring External Dependencies Repository</name>
        <url>
http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/
        </url>
    </repository>
    <repository>
        <id>spring-release</id>
        <name>Spring Portfolio Release Repository</name>
        <url> http://s3.amazonaws.com/maven.springframework.org/release</url>
    </repository>
    <repository>
        <id>spring-external</id>
        <name>Spring Portfolio Release Repository</name>
        <url> http://s3.amazonaws.com/maven.springframework.org/external
        </url>
    </repository>
    <repository>
        <id>spring-milestone</id>
        <name>Spring Portfolio Milestone Repository</name>
        <url> http://s3.amazonaws.com/maven.springframework.org/milestone
        </url>
    </repository>
    <repository>
        <id>i21-s3-osgi-repo</id>
        <name>i21 osgi artifacts repo</name>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <url> http://s3.amazonaws.com/maven.springframework.org/osgi</url>
    </repository>
</repositories>

 

这一步做完并保存,m2eclipse将自动导入pom.xml文件中声明的导入库:

11

通过m2eclipse执行maven的install

和通过命令行执行:

mvn install

效果相同,使用m2eclipse执行:

12

编写POJI和POJO

编写一个HelloWorldService接口:

package com.easymorse.marshal;

public interface HelloWorldService {
    public void sayHello();
}

编写该接口的实现,HelloWorldServiceImpl:

package com.easymorse.marshal;

public class HelloWorldServiceImpl implements HelloWorldService {
    public HelloWorldServiceImpl() {
        System.out.println("————–>new HelloWorldService start");
    }

    @Override
    public void sayHello() {
        System.out.println("Hello!!!!!!!!!!!!!!!!");
    }
}

编写spring的配置文件

一般根据spring推荐的做法,有关业务服务方面的bean放在一个配置文件中,有关osgi的bean放在另外的配置文件中,这样便于管理。

创建目录:

13

创建helloworldService.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="helloworldService" class=" com.easymorse.marshal.HelloWorldServiceImpl" />
</beans>

创建helloworldService-osgi.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/osgi"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
    <service id="helloworldServiceOsgi" ref="helloworldService"
        interface="com.easymorse.marshal.HelloWorldService" />
</beans:beans>

通过spring ide osgi扩展安装目标平台

这里不能使用eclipse内置的平台,而是要使用spring-dm的平台。获取和配置这些的最简单办法就是安装spring ide,并且包括osgi可选项。

安装的网址:

http://dist.springframework.org/snapshot/IDE/nightly

这里使用比较新的每日构建版本,发现spring ide osgi extension目前还没有spring-dm1.1版本的target platform。下面演示是使用spring-dm 1.0.2的target platform,目前测试是可以使用。在plug-in development属性中设置spring-dm 1.0.2作为target platform,并load target:

15

编辑plug-in的MANIFEST.MF

设置运行时(runtime)标签页中的导出包(exported package):

 15

修改运行选项

上面运行配置中将target platform去掉了,现在加上:

16

运行的效果:

17

可以看出是运行在spring-dm 1.0.2上。

手工设置spring-dm 1.1环境

如果需要用到spring-dm 1.1的新特性,可以手工实现环境搭建,不用预置的target platform。首先pom.xml文件的dependencies部分修改为:

<dependencies>
    <dependency>
        <groupId>org.aopalliance</groupId>
        <artifactId>com.springsource.org.aopalliance
        </artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>com.springsource.org.apache.commons.logging
        </artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.cglib</groupId>
        <artifactId>com.springsource.net.sf.cglib
        </artifactId>
        <version>2.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.osgi</groupId>
        <artifactId>org.springframework.osgi.core
        </artifactId>
        <version>1.1.2.A</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.osgi</groupId>
        <artifactId>org.springframework.osgi.io
        </artifactId>
        <version>1.1.2.A</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.osgi</groupId>
        <artifactId>org.springframework.osgi.extender
        </artifactId>
        <version>1.1.2.A</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.osgi</groupId>
        <artifactId>org.eclipse.osgi</artifactId>
        <version>3.4.2.R34x_v20080826-1230</version>
    </dependency>
</dependencies>

然后执行maven的复制依赖库的插件:

mvn dependency:copy-dependencies

在target/dependency目录下应该复制了所有依赖的绑定jar文件。

导入这些绑定,通过eclipse的import功能:

1

取消target platform勾选,通过browse找到项目的dependecy目录:

2

下一步,add all即可,是全部所需的绑定:

 3

完成后,package explorer中增加了其他绑定:

4

再次运行helloService,可以看到加载spring的日志,其中包括实例化helloService的打印内容:

5

在osgi控制台执行ss,看到所有绑定的状态:

 6

手工执行的好处是,能够了解每个细节,而且可以去除所有不必要的绑定。

总结一下各个绑定(组件)和子系统之间的依赖关系:

components

增加跟踪信息 

上面的启动没有留下日志信息,可以利用run选项里面的tracing标签页增加跟踪信息:

28

运行时可看到如下跟踪日志,比如加载绑定的耗时等:

 29

源代码

http://easymorse.googlecode.com/svn/trunk/osgi/helloworldService/

参考文档

PDF    发送文章为PDF   

这篇文章上的评论的 RSS feed TrackBack URI

Leave a Reply