在Java中现在是没有一个模块化的概念的,或者说没有一个事实上的标准。就是如何组成一个模块,然后哪些模块是给内部使用,哪些模块是给外部使用的。
OSGI就可以解决上面的问题,应用程序可以像搭积木一样完成搭建,例如对于一个正在运行的系统,压根日志服务,但目前系统中没有提供日志服务的模块,那么可以直接开发出相应的日志服务模块,然后动态的加载到系统中,不需要重新启动服务,只需要动态的注册就可以,这样日志服务就可以使用了。
这是一个使用osgi的开源系统
详细介绍的地址:
http://www.iteye.com/news/23015
其实搞过开发的大概都知道,业界中鼎鼎大名的eclipse就是基于osgi来开发的。
并且很多大的应用厂商也在使用osgi进行模块化的开发。
包括spring、ibm的websphere和oracle的weblogic都已经宣布了支持osgi,这也同样可以看出,成为业界的标准可能就是下一步的问题。
bundle其中有包的意思,这个是osgi中比较核心的一个概念,也就是说我们控制osgi就是通过bundle来进行控制的。
bundle可以被动态的安装、启动、停止和卸载。并且Bundle也是服务和组件的载体。
看看Bundle Jar File的结构图:
Bundle的生命周期状态图:
Bundle状态解析:
Class Loading的概念图:
再看看服务注册
看看上边这个图是不是非常熟悉,典型的一个服务注册,发布,寻址的结构图,跟SOA的架构基本一致,也就是说osgi也是实现soa技术的方式之一。
通过上面的介绍,可以看出,其实Bundle就是我们手中的积木,通过osgi的框架把这些积木组织在一起,就形成了系统。
Bundle间的交互方式有两种:
1)通过package的Export和Import来进行。
2)另一种方式是通过Service的方式进行。
定义了动态协作模型,该模型是一个发布、查找和绑定的模型。
Bundle可以注册服务、搜索服务、监听服务。通过BundleContext完成注册和获取服务,通过ServiceListener监听服务的状态。
OSGi 4推出了Declarative Services(DS) DS 提出了完整的 Service-Oriented Component Model (SOCM),面向服务的组件化模型—更好支持服务注册、获取、监听。
Component存在于Bundle中,可以相互调用。
选择eclipse3.1之后的版本的eclipse.
选择Run->Run Configuration
打开如下界面
在OSGI Framework上点击右键,新建,将显示所有的Bundles
取消所有Bundles的选择,只选择org.eclipse.osgi这个Bundle
运行,如果控制台中出现osgi>并且没有提示错误信息,说明配置成功。
然后输入ss,则可出现如下界面:
至此环境搭建完毕。
创建一个Plug-in project
然后点击下一步,输入工程名,要注意This plug-in is targeted to run with:这里选择的是standard
添入插件相关信息:
打开生成的Activator类,在start和stop方法中加入输出
public class Activator implements BundleActivator { private static BundleContext context; static BundleContext getContext() { return context; } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start(BundleContext bundleContext) throws Exception { Activator.context = bundleContext; System.out.println("hello OSGI started!"); } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext bundleContext) throws Exception { Activator.context = null; System.out.println("hello OSGI stoped!"); } }
然后右键工程,选择Run Configuration,将Default Auto-Start设置为false
运行应用,分别输入start 1、ss、stop 1、ss
得到如下结果,则证明运行成功