标签:
什么是osgi ?osgi 是java模块化规范,翻译过来开放服务网关协议(Open Service Gateway Initiative) OSGI不是一个应用层面的框架,而是软件设计层面的规范
它能为我们带来什么?
1 可重用的组件积累和复用,功能解耦。(复用、内聚、藕合都能在osgi中很好地体现)
2 运行在特定的osgi容器中,启动速度快,。
3 OSGI 也能让你动态的增减服务,或者说动态的加载卸载类等资源(热插拔效果)。
osgi框架选择 我们使用felix创建一个demo
创建之前先了解几个概念
Bundle:其实就是一个带描述的jar文件。 osgi一个组件就是一个Bundle
来看一下Bundle的声明周期:
bundle需要install到osgi framework上,这个install只是让framework用一个classloader来装载bundle里的类和资源。
接着就是resolve,检查bundle需要“引用”的package是否可用,这个后续再详细介绍。
然后,bundle就要start,也就是运行activator里的start方法,方法运行完毕,即进入"ACTIVE"的状态,这时bundle就算正式可用了。
构建一个osgi的helloword
首先创建一个maven工程
在maven的pom文件中添加Maven Bundle Plugin
<plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package>org.foo.myproject.api</Export-Package> <Private-Package>org.foo.myproject.*</Private-Package> <Bundle-Activator>org.foo.myproject.impl1.Activator</Bundle-Activator> </instructions> </configuration> </plugin> </plugins>
这段插件在felix官网可以找到。 此插件是必须的创建Bundle依赖他
还有就是需要添加一个osgi——core包的依赖
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>4.2.0</version>
<scope>provided</scope>
</dependency>
整理后的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.bean.demo</groupId>
<artifactId>osgi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cn :: bean :: sun :: osgi_demo</name>
<packaging>bundle</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- osgi -->
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>4.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Description>${project.description}</Bundle-Description>
<Import-Package>org.osgi.framework</Import-Package>
<Export-Package></Export-Package>
<Embed-Transitive>true</Embed-Transitive>
<Embed-Directory>dependency</Embed-Directory>
<Bundle-Activator>cn.gzydt.sun.Activator</Bundle-Activator>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
现在还需实现编写一个BundleActivator接口的java类 可以实现当一个bundle启动或停止。
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception {
System.out.println("cn.bean.demo 组件--> start....");
}
public void stop(BundleContext context) throws Exception {
System.out.println("cn.bean.demo 组件--> stop....");
}
}
当osgi容器加载这个组件的时候就会触发start方法,当组件被卸载或者更新的时候就会stop,在进行start(前提是在pom文件的maven-bundle插件中添加这个激活
<Bundle-Activator>cn.gzydt.sun.Activator</Bundle-Activator>
)
然后用maven命令 mvn compile :编译源代码 mvn package 生成一个bundle文件(pom文件中的package类型为bundle)
然后把bundle丢在osgi运行环境的容器我这里用的apache-servicemix-6.0.3 官网最新的版本已经Apache ServiceMix 7.0.0.M1 我试了一下 感觉不是很好用,
启动容器
标签:
原文地址:http://www.cnblogs.com/sunjiqiang/p/5516656.html