OSGi Pure Plugin Architecture Introduction

来源:百度文库 编辑:神马文学网 时间:2024/06/03 03:48:46

OSGi Pure Plugin Architecture Introduction

关键字: opencore

OSGi体系结构

OSGi 的初衷是面向嵌入式系统的应用,支持在一个Java虚拟机上加载和启动多个Java应用程序。随着OSGi在Eclipse3.0上的应用成功,其逐渐成为构建纯插件结构的企业级应用软件系统的首选平台。

OSGi 是一个纯插件的体系结构,OSGi 框架实现是一个最为核心的插件,逻辑实现分层见下面两张图:


            

L0层Java执行环境

OSGi最初规范定位到嵌入式系统,例如家电、汽车、手机等执行环境,所以插件要配置适合的运行环境与Policy。当OSGi框架加载插件时会对插件要求的执行环境做校验。例如,Eclipse中可以配置下图中的执行环境:



L1模块层(组件或插件层)

L1模块层(插件层 或组件层)定义插件的ClassLoading策略(Policy),这也是OSGi最为出色和吸引人的地方。我们知道,任何一个Java平台的插件体系结构,首先要解决的是ClassLoading的问题。OSGi在Java动态ClassLoading基础之上,提供了完美的插件ClassLoading解决方案。传统J2SE程序,有单一的Classpath包含所有的classes与resources,L1插件层为每个OSGi插件提供了私有的Classpath和独立的Classloader,有效的控制了插件间的Class隔离、依赖与协作。

插件间的Class依赖关系见下图(版权归www.osgi.org):


插件的类空间(Class Space)见下图(版权归www.osgi.org):


插件的类加载过程:



L2插件生命周期管理层

L2层负责运行时动态安装(Install)、启动(Start)、停止(Stop)、更新(Update)或卸载(Uninstall)插件。

插件的生命周期见下图(版权归www.osgi.org):


L3服务注册层

L3提供了一个动态的服务注册模型,插件可以注册(register)、发现(lookup)、使用(reference)服务。

该层的服务注册采用ServiceLocator模式,见下面图示:



该层的实现由于没有直接的IoC容器支持,被很多过分相信IoC作用的人所批评。MartinFowler曾经说过,“说一个系统是基于IoC的,就好像说一个汽车有四个轮子”,IoC只不过是一种模式和设计原则,任何一个设计得比较好的面向对象系统都或多或少的具备这样的特征,这与存不存在一个独立的IoC容器关系不大,尽管IoC容器在开发上带来很大的便利与优势。另外一个方面,IoC容器本质上还是一个Service Registry,只不过增加依赖装配功能,所以在OSGi的服务注册模型上,可以很容易的支持IoC。

OpenCore在该层的服务模型下实现了非常灵活的分级IoC容器,支持插件级、应用程序级、网络级的IoC功能。
  • 14:06
  • 浏览 (2649)
  • 论坛浏览 (4109)
  • 评论 (0)
  • 分类: OSGi
2006-12-25缩略显示

OpenCore:OSGi上部署Apache Common Log

关键字: apache common logApache CommonLog提供的动态Logger发现机制实在损害Apache基金会的声誉,这是一个看似巧妙实际上画蛇添足的设计。这种机制无法保证在有多ClassLoader的JEE或OSGi环境下正常工作,这几天收到了Spring-OSGi google群组发出的“Commonslogging madness”信件超过20封,今天又在java-blog上收到“common logwoes"的文章,估计这个问题把很多人搞疯了:)

最后,这帮家伙终于讨论出了解决方案,就是用SLF4J来替换Apache Common Log的实现。我们今天用这个方案替换掉了OpenCore原来的common log插件,静态帮定到Log4J,工作良好。

具体插件实现如下:

lib目录加入:
jcl104-over-slf4j-1.1.0.jar
log4j-1.2.13.jar 
slf4j-api-1.1.0.jar 
slf4j-log4j12-1.1.0.jar

插件的自描述文件(MANIFEST.MF)配置:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.apache.commons.log
Bundle-Version: 2.0.0
Bundle-ClassPath: .,
 lib/slf4j-api-1.1.0.jar,
 lib/log4j-1.2.13.jar,
 lib/jcl104-over-slf4j-1.1.0.jar,
 lib/slf4j-log4j12-1.1.0.jar

Bundle-Vendor: %pluginProvider
Bundle-Localization: plugin
Export-Package: org.apache.commons.logging;version="1.1.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: org.osgi.framework
Bundle-Activator: org.apache.commons.log.osgi.Activator

然后实现一个简单的Activator,根据自己需求配置Log4j:

package org.apache.commons.log.osgi;

import java.io.File;

import org.apache.log4j.PropertyConfigurator;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
        File file = new File("./etc/log4j.properties");
        PropertyConfigurator.configure(file.toURI().toURL());
    }

    public void stop(BundleContext context) throws Exception {
    }