Karaf 依赖equinox and felix,karaf 本Apache的很多项目作为基础框架

6月17日是Apache Karaf作为Apache顶级项目。Karaf是个运行时包,包含了一个OSGi框架(Equinox或Felix)、一个命令shell(Felix Gogo)及默认情况下内置的大量实用工具。

虽然Equinox与Felix可以单独使用,但Karaf旨在结合这两个框架出色的OSGi功能,并且保证其开箱即用。比如说,它包含了一个可配置的日志系统(基于Log4J,但针对众多通用的日志系统进行了包装)、通过SSH实现的远程访问、通过ConfigAdmin(源代码位于etc目录中)的配置以及内建的JAAS支持。不仅如此,Karaf还安装了Pax URL的MVN协议,这样就可以从Maven中央仓库(在必要的情况下会自动将其包装为bundle)安装bundle了。

此外,Karaf还提出了特性的概念,所谓特性就是bundle的集合,能以组的形式安装到运行着的OSGi运行时当中。特性包含了对obr、jetty以及spring的支持,做到了开箱即用。这样,如果需要安装多个bundle,但这些bundle之间并没有严格的运行期依赖,那么这种支持就可以大大简化这种情况。

在迁移到Apache Felix项目中前Karaf是ServiceMix Kernel,并且最终成为了Apache的顶级项目。Karaf还加入到了其他框架当中,如Eclipse VirgoEclipseRT packages,提供了预先配置的框架与好用的OSGi bundle,这样在上手使用OSGi运行时时就会比以往更加简单。

http://felix.apache.org/downloads.cgi#framework

http://git.eclipse.org/c/equinox/rt.equinox.framework.git/commit/bundles/org.eclipse.osgi

Karaf作为一款成熟而且优秀的OSGi运行环境以及容器已经被诸多Apache项目作为基础容器,例如:Apache Geronimo, ApacheServiceMix, Fuse ESB,由此可见Karaf在性能,功能和稳定性上都是个不错的选择。

从四个方面对karf进行了分析,分别为karaf的环境变量、启动级别、karaf中出现的新概念和核心技术。

karaf涉及两个环境变量,分别为KARAF_HOME和KARAF_BASE,KARAF_HOME目录下存放的是启动karaf的必需文件,目录结构如下所示: KARAF_HOME
lib目录中包含三个文件,分别为karaf.jar、karaf-client.jar和karaf-jaas-boot.jar,这些文件会缺省加入karaf的CLASSPATH中。
etc目录中主要包含了OSGi Framework的选择配置,如使用何种OSGi Framework实现。
system目录中包含了eclipse和felix实现的OSGi Framework实现jar包。

karaf拥有6个启动级别,分别为5、8、10、15、30、40。其启动顺序是先启动数字小的级别。

  • 5级,包含了符合OSGi URL Handlers Service Specification(OSGi Core规范中第11章)的mvn协议和wrap协议。
  • 8级,包含了日志适配器(包含log4j,slf4j,commons-logging等)和日志服务。
  • 10级,包含了规范API、配置管理服务(104)、用户偏好服务(106)。
  • 15级,包含了热部署器。
  • 30级,包含了GShell、Spring DM、JMX等。
  • 40级,包含了GShell的启动器,运行至此级别时GShell转换为可用状态。

karaf设置了两个缺省级别,分别为60和100,60是指当有外部应用部署至karaf时,karaf将会把此应用的启动级别设置为60;100是指karaf启动时会缺省启动到级别100,即100以下的所有bundle都会被启动。 
karaf中引用了feature的概念。feature是符合某个功能特性的bundle集的部署描述符,配置文件如下所示:

Xml代码  收藏代码
  1. <features>  
  2.     <repository>urn:r1</repository>  
  3.     <feature name="f1">  
  4.         <config name="c1">  
  5.             k=v  
  6.         </config>  
  7.         <bundle>b1</bundle>  
  8.         <bundle>b2</bundle>  
  9.     </feature>  
  10.     <feature name="f2">  
  11.         <feature>f1</feature>  
  12.         <bundle>b3</bundle>  
  13.     </feature>  
  14. </features>  

 


krarf可以静态的切换OSGi Framework实现,它的实现方法如下所示:

    1. 从配置文件中得到OSGi实现jar包的相对路径
    2. 利用反射机制将此jar包加入到当前ClassLoader
    3. 读取/META-INF/services/org.osgi.framework.launch.FrameworkFactory文件以得到FrameworkFactory的实现类名
    4. 通过反射机制将此类实例化后创建Framework实例并启动
原文地址:https://www.cnblogs.com/viewcozy/p/4898527.html