OSGI小记
前几个人因为项目中考虑使用OSGI来开发,因此和同事调研了大概1个多月,当时没做记录,现在来弥补下
OSIG,一个构件模块化,动态化系统的标准,众多应用服务器实现微核采用的技术,如weblogic,glassfish,最出名的是equinox,eclipse核心。
在OSGI环境中,体现模块化,动态化,
模块化:模块之间独立,部首其他模块影响。
其他模块只能访问该模块对外提供的服务
模块具备独立的生命周期,如启动,停止,更新
动态化:
对于模块的增加,修改,删除,不需要做 额外的处理。
OSGI中,每个模块就是在物理上就是一个bundle,一个JAR包,是OSGI部署的最小单位,需要在每个JAR包的MANIFEST.MF中给这个bundle标识,象bundle-name,Bundle-SymbolicName,Bundle-ClassPath,Bundle-Activator;
OSGI中bundle的隔离是通过java ClassLoader隔离性来完成的,JAVA中每个classloader空间都是隔离的,默认的classloader有bootStrap ClassLoader(jre/lib,jre/classes) extension classloader(jre/lib/ext),system classloader(-classpath),一般osgi框架还实现自己的应用类加载器。
bundle隔离机制实现:每个bundle都有一个独立的classloader,通过bundle-classpath指定JAR路径
java中通过双亲委托来加载类,寻找类首先是从parent classloader中寻找,如果找不到才在当前的clasloader中寻找
bundle类加载过程:
java.*开头的类委派给parent classloader加载;
bootdelegationcan参数中配置的也委派给parent classloader加载,parent classloader找不到则继续下面的操作;
是否在import-Package中,在则委派给导出他的bundle的classloader 加载,不在则继续下面
是否在require-bundle中,在则委派给相应的bundleloader加载,不在继续下面的
是否在自己的bundle-classpath 中,不在则继续下面的
是否在fragmentsbundle的classpath中寻找,不在则继续下面的(
在 OSGi 框架中提供了一种称为 fragment 的特殊 bundle。在装载的过程中,这类 fragment 是被附加到被称为“宿主”的 bundle 上,最后作为一个整体 bundle 运行于 OSGi 环境中。最为典型的 fragment 应用场景是多语言包发布,将包含多语言包的 bundle 作为主体程序 bundle 的 fragment,这样可以将多语言包和主体 bundle 作为两个独立的部分来发布,但在运行时它们又是一个整体。)
是否在export-package中,不在继续下面的
是否在dynamicimport-package中,在则加载,不在则抛classNotfoundexception
通过MANIFEST.MF定义import-package等,当要注意,最好定义包的版本 如:Import-Package: org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.3.0"
Import-Package寻找机制:
resolved的优先未resolved
版本高的优先版本低的,如果版本一样,则比较bundle id,小的优先,也就是先安装的bundle优先