参考:
eclipse中进行示例:http://www.cnblogs.com/HeroBeast/archive/2012/03/13/2393698.html
spring标签使用:http://blog.youkuaiyun.com/shuyaji/article/details/1393272
四种osgi框架介绍:http://www.cnblogs.com/longkerdandy/archive/2010/09/29/OSGi_Compare.html
一 命令行环境搭建:
1、下载osgi的equinox实现:
org.eclipse.osgi-3.5.1.R35x_v20090827.jar
这里面有,或者maven仓库里面应该搜得到,到处都有的下
2、测试osgi环境:
java -jar org.eclipse.osgi-3.5.1.R35x_v20090827.jar
可以用基本的osgi命令行查看已经启动的bundle:ss
3、下载springDM需要的包:
从中间选出下面这些包,和org.eclipse.osgi一起,放到一个文件夹,比如 /spring-osgi-min :
4、步骤2运行过以后,会产生一个configuration/config.ini文件,加入如下内容:
osgi.bundles=
com.springsource.org.aopalliance@start,com.springsource.org.apache.log4j@start,com.springsource.slf4j.api@start,com.springsource.slf4j.log4j@start,com.springsource.slf4j.org.apache.commons.logging@start,org.springframework.aop@start,org.springframework.asm@start,org.springframework.beans@start,org.springframework.context@start,org.springframework.context.support@start,org.springframework.core@start,org.springframework.expression@start,spring-osgi-core@start,spring-osgi-extender@start,spring-osgi-io@start
5、测试spring-osgi环境:
java -jar org.eclipse.osgi-3.5.1.R35x_v20090827.jar
如果看到 log4j:WARN 这样的输出,没关系,不影响示例。可以用ss查看除了一个log4j的包RESOLVED之外,其他都ACTIVE了。
二 测试spring特性
按你的习惯,编写一套spring osgi的测试包,我的如下:
test.api-0.0.1.jar
test.provider-0.0.1.jar
test.consumer-0.0.1.jar
1、在eclipse中新建maven工程,取名api,并如下配置pom.xml文件:
<groupId>test.springDM</groupId>
<artifactId>test.api</artifactId>
<version>0.0.1</version>
<packaging>bundle</packaging>
上面打包的方式要写bundle,不然maven-bundle-plugin插件会不生效(了解不多,测验得知)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.4.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>api</Bundle-SymbolicName>
<Export-Package>test.springDM.api</Export-Package>
<Bundle-Vendor>My Name</Bundle-Vendor>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
写一个接口类:
package test.springDM.api;
public interface PersonManager {
public void savePerson(String username, String password);
}
2、新建maven工程provider,如下配置pom.xml
<groupId>test.springDM</groupId>
<artifactId>test.provider</artifactId>
<version>0.0.1</version>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>test.springDM</groupId>
<artifactId>test.api</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.4.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>provider</Bundle-SymbolicName>
<Export-Package></Export-Package>
<Bundle-Vendor>My Name</Bundle-Vendor>
<Include-Resource>/META-INF = /META-INF</Include-Resource>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
并在工程下新建 /META-INF/spring/services.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" xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
<bean id="personManager" class="test.springDM.provider.PersonManagerImpl" />
<osgi:service id="personManagerService" ref="personManager"
interface="test.springDM.api.PersonManager" />
</beans>
编辑Java代码:
package test.springDM.provider;
import test.springDM.api.PersonManager;
public class PersonManagerImpl implements PersonManager {
public PersonManagerImpl() {
System.out.println("instance PersonManagerImpl");
}
public void savePerson(String username, String password) {
System.out.println("save person: " + username + ", " + password);
}
}
3、新建maven工程consumer,类似配置pom文件,services.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" xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
<osgi:reference id="personManagerOSGI" interface="test.springDM.api.PersonManager">
<osgi:listener ref="serviceChecker" bind-method="bind"
unbind-method="unbind"></osgi:listener>
</osgi:reference>
<bean id="activator" class="test.springDM.consumer.Activator"
init-method="start" destroy-method="stop">
</bean>
<bean id="serviceChecker" class="test.springDM.consumer.ServiceChecker"
factory-method="getInstance">
</bean>
</beans>
Java类:
package test.springDM.consumer;
import org.osgi.framework.FrameworkUtil;
/**
* 如果一个Bean对象需要访问BundleContext,则可以让该Bean对象实现BundleContextAware接口
*/
public class Activator {
// private static Logger logger = Logger.getLogger(Activator.class);
public void start() throws Exception {
System.out.println("start "
+ FrameworkUtil.getBundle(Activator.class).getSymbolicName());
Thread t = new Thread(new Runnable() {
public void run() {
while (ServiceChecker.getInstance().getPersonManager() == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ServiceChecker.getInstance().getPersonManager()
.savePerson("sb", "sb");
// logger.debug("hehe");
}
});
t.start();
}
public void stop() throws Exception {
System.out.println("stop Activator");
}
}
package test.springDM.consumer;
import java.util.Map;
import test.springDM.api.PersonManager;
public class ServiceChecker {
private static ServiceChecker INSTANCE = new ServiceChecker();
private PersonManager personManager;
private ServiceChecker() {
}
public static ServiceChecker getInstance() {
return INSTANCE;
}
public void bind(Object service, Map properties) {
if (service instanceof PersonManager) {
this.setPersonManager((PersonManager) service);
System.out.println("service personManager bind!");
}
}
public void unbind(Object service, Map properties) {
if (service instanceof PersonManager) {
this.setPersonManager(null);
System.out.println("service personManager unbind!");
}
}
public PersonManager getPersonManager() {
return personManager;
}
public void setPersonManager(PersonManager personManager) {
this.personManager = personManager;
}
}
4、打包编译好以后,一样放到 spring-osgi-min 文件夹下,并在 config.ini文件里面,添加这三个包:
test.api@start,test.consumer@start,test.provider@start
一样启动osgi:
java -jar org.eclipse.osgi-3.5.1.R35x_v20090827.jar
理想结果: