1999年3月,OSGi联盟(非盈利性质)成立,目标 是建立家庭网关,并通过互联网向家庭网络提供各种服务,例如通过web页面控制咖啡机等;
Eclipse V3.0采用OSGi,使得OSGi成功进入Java企业应用领域,并成为其中重要一员;同时Eclipse推出了OSGi R4 RI:Equinox,所以直接使用Eclipse即可开发OSGI框架的程序
OSGI是什么?
Dynamic Module System For Java这是OSGi最开始的定义;
意味着基于OSGi就可以模块化的开发Java应用;
意味着基于OSGi就可以模块化的部署Java应用;
还可以动态的管理模块。
Universal Middleware
这是OSGi近年来新取的名词,目标是让OSGi脱离语言限制,成为所有语言的统一模型。
在OSGi中这不是一个虚拟的概念,而是一个实体:Bundle
Bundle是一个普通的jar,只是其META-INF中的manifest.mf中描述了一些标准的模块的信息。
以下是manifest.mf文件内容示例:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: A
Bundle-SymbolicName: A
Bundle-Version: 1.0.0
Bundle-Activator: a.Activator
Bundle-Vendor: zjm
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ActivationPolicy: lazy
模块的交互方式:
以package方式交互:
通过Export-Package对外提供packages;
通过Import-Package使用其他模块的packages;
Package支持版本机制;
以service方式进行交互:
符合面向接口原则;
支持IoC方式注入;
面向服务的组件模型,Single VM下SOA的一种典型实现。
模块的生命周期如图:
osgi下的控制台有很多命令,可通过help命令进行查看用法
安装模块,有两种方式:
1,使用目录模式,install file:/D:\work\workspace\OSGi-Bulletin\FirstBundle,注意目录名中不能有空格
2,使用jar模式,先将bundle导出成可部署的插件,然后在控制台执行install
file:/D:\Opendoc\Equinox\plugins\FirstBundle_1.0.0.jar
示例:第一个OSGI实例
新建eclipse 插件项目,选择osgi平台,将自动生成Activator类,它是启动模块的类
package a;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
//自己写的
System.out.println("osgi bundle started");
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
//自己写的
System.out.println("osgi bundle stopped");
}
}
项目结构图:
运行 在osgi框架上,结果如下:
用ss命令可查看模块
可以停止模块: