osgi
自90年代末以来,OSGi作为一种技术已经存在,最初是在嵌入式领域。 在Eclipse采用OSGi作为Eclipse IDE底层的集成和插件技术之后,人们产生了更广泛的兴趣。 此举之后,OSGi被采用为大多数JEE应用程序服务器核心的模块化技术。 即使到那时,OSGi在单个应用程序领域也要稀少得多。 只有在带有Spring dmServer的专用企业级OSGi编程模型出现之后,我们才看到对OSGi的广泛兴趣。
假定读者熟悉一些基本的OSGi概念,例如捆绑软件,捆绑软件清单,服务和OSGi生命周期。 完全不熟悉OSGi的读者可以参考入门资源,例如尼尔·巴特利特(Neil Bartlett)的“ 实践中的OSGi ”以及OSGi主页 。
开发捆绑
在最简单的层次上,OSGi捆绑包只是一个传统的JAR文件,其清单包含一些其他标头,这些标头定义了捆绑包的身份以及其(包)功能和要求–导入和导出。 但是,经常被引用的粗体说法“使用OSGi不再出现NoClassDefFoundErrors”依赖于正确的元数据。 缺少所需软件包的导入很容易意味着OSGi在最初使用时实际上会引入更多的缺失类,而不是更少。
因此,用于OSGi开发的工具至少应帮助开发人员生成正确的元数据和结构合理的捆绑包。 除此之外,开发工具还应有助于测试捆绑软件的运行,并且理想情况下应支持OSGi编程模型,例如组件模型,Web应用程序捆绑软件,持久性捆绑软件等。
Eclipse PDE和天秤座
另一方面,结果清单不会包含任何意外。 同样,一些有关版本范围和Require-Bundle使用情况的默认建议也不符合被广泛接受的OSGi最佳实践。
对于开发更多以企业为中心的OSGi应用程序,例如使用捆绑包中的JPA结束Servlet功能, Eclipse Libra承诺是一个有趣的选择。 该项目与IBM的免费(但不是开源) OSGi开发工具松散相关,旨在将现有的用于JEE开发的高质量Eclipse工具与OSGi企业规范相应章节中定义的OSGi特定功能集成在一起。
Bnd和BndTools
尽管PDE的显式创作方法确实可以工作,但还有另一个更方便的选择,即可以生成大多数困难的东西(尤其是Import-Package)。
毕竟,源代码以及字节码都具有确定依赖关系所需的大多数信息。 彼得·克林斯(Peter Kriens)的Bnd工具建立在这样的前提下:大多数清单可以用简洁的领域特定语言(DSL)描述,其余的可以在通过内省这些类来组装捆绑包时填写。 使用这种方法,将第三方JAR转换为功能束也变得很简单(假设它们没有对代码中的类加载器进行假设)。 Bnd还尊重OSGi最佳实践,例如为导出的软件包生成use指令。
带有Felix Bundle插件和Pax Construct的Maven
上面的项目以IDE为中心或与Bnd无关。 一些读者可能正在寻找非常成熟的构建解决方案,尤其是在面对大型OSGi应用程序时。 这可以在几乎所有Apache OSGi项目中使用的Maven构建基础结构中找到。 Maven作为OSGi项目的构建选择,因为所有主要的IDE都具有Maven插件,因此可以自由选择IDE。 而且,Maven的依赖性管理有利地与OSGi的模块化概念保持一致。 Maven本身不直接支持OSGi打包,但是Apache Felix Bundle插件增加了该功能,并在Apache项目中广泛使用。 Felix软件包插件在后台使用Bnd,因此用于定义软件包的配置选项与直接使用Bnd或通过BndTools使用Bnd的配置选项相同。
尽管Maven有许多优点,但为OSGi建立正确的基础结构却是一个耗时的过程,尤其对于Maven新手而言,这似乎令人生畏。 幸运的是, Pax Construct项目提供了一个非常有用的入门工具包。 它有助于创建Maven 2 OSGi项目并定义单个捆绑包。 Pax Construct还为从Maven启动测试OSGi环境提供了出色的支持。
组件模型
最后,如果不提及组件模型,那么关于OSGi开发的任何部分都将是不完整的,组件模型极大地简化了OSGi动态性的使用,尤其是OSGi服务(或由 Peter Kriens称为μServices的μServices )的使用。 这两个模型使开发人员免于使用复杂的OSGi API进行服务的责任,并且在某种程度上还可以隐藏一些不需要的动态特性。 作为OSGi汇编规范的一部分,两个组件模型已经标准化,并且得到了广泛使用。
OSGi Compendium Specification版本4.2引入的更新的组件模型Blueprint提供了完整的依赖项注入框架,该语法从语法上基于流行的Spring框架,并提供了与OSGi服务注册表交互的一流支持。 除了XML组件描述符的语法外,声明性服务和蓝图之间最显着的区别可能在于两者如何公开OSGi服务动态。
声明式服务将动态直接暴露给客户端代码。 通过一种方法(在示例中为addProvider)注入的服务通过另一种方法(在示例中为remove-Provider)删除。 当强制性服务依赖关系消失时,组件将被停用;当替换可用时,组件将被重新激活。 另一方面,蓝图试图隐藏其中的一些动态。 例如,如果所需的服务依赖项不可用,则不会停止或通知Blueprint bean。 实际上,它将继续运行,直到组件尝试以某种方式使用所需的服务为止。 那时,Blueprint容器将暂停以等待替换服务可用,然后继续对该服务进行暂停的方法调用。 通过此服务,基于Blueprint构建的OSGi捆绑包可以忽略其服务依赖项的短暂中断(例如由于实时更新),同时仍可享受潜在的连续更新带来的好处。 当然,Blueprint还支持让组件侦听服务生命周期事件并对其做出直接React。 清单3中的Blueprint片段显示了与之前显示的Declarative服务描述符等效的Blueprint描述符。
一个值得特别提及的特别不错的选择是可以基于Apache Felix Web Console设置Web控制台 ,当然也可以在其他运行时中单独安装它。
供应
Pax Runner配置文件和Karaf功能依赖于捆绑包的预定义集合。 这样做的好处是,可以可靠地测试构成特征的束的具体选择。 但是,这种供应机制无法利用运行时功能的存在。 例如,战争功能需要servlet API,并且将在运行时中不管servlet类是否已经可用(以正确的软件包版本)都将安装Geronimo servlet API捆绑包。 功能和配置文件的主要挑战是它们不声明声明的捆绑包依赖项(Import-Package,Require-Bundle等),因此置备系统无法避免重复。
为了使用OBR,Karaf在OBR功能中提供了OBR预配器。 可以通过Bindex工具 (仅支持在软件包清单中声明的??软件包和软件包依赖项)或Apache Aries存储库生成器 (用于为Blueprint定义的服务和引用生成功能和要求)来生成软件包存储库。 。 可以在Apache Felix Sigil找到公共OBR存储库的集合。
预先建立的企业堆栈
到目前为止提供的运行时选项都与简化管理自定义运行时的任务有关,仅使用所需OSGi应用程序所需的功能,而不会增加负担。 但是,在某些情况下,较小的运行时和更快的启动时间所带来的好处将不会超过管理轻量级应用服务器运行时所需的额外工作,而不是采用预定义的全包程序。
共有三个开源选项: Apache Geronimo 3.0 , Eclipse Virgo和Glassfish 。 这些都支持不同类型的应用程序。 这些完整选项的基础是许多企业规范,其中包括Blueprint,JNDI,Web和JPA。 这些可以作为单独的组件从Eclipse Gemini和Apache Aries中获得,但Pax Web提供的Web应用程序捆绑支持除外,可以单独使用(例如,通过Karaf,它具有针对Aries组件的预定义功能) )。 即使应用程序模型在语法上有所不同,Geronimo和Virgo之间的核心思想是相同的。
通过Geronimo中的应用程序清单或处女座中的计划定义的OSGi应用程序定义了从逻辑上定义应用程序的捆绑软件(甚至是处女座的计划中的配置工件)的集合。 作为示例,上面显示了Apache Aries Blog示例应用程序的描述符。
分配
在采取OSGi开发的第一步后不久,许多人想知道如何将事物连接起来。 例如,如何使在两个不同框架中运行的两个OSGi应用程序互相通信OSGi应用程序如何容易地分布在多个部署系统中
如何将OSGi应用程序连接到旧版JEE应用程序Apache CXF和Tuscany提供了一些答案。 Apache CXF是分布式OSGi规范的参考实现。 通过非常简单的元数据添加,它允许在OSGi服务级别上连接两个OSGi框架。 这种分配方法非常适合OSGi服务模型,该模型从一开始就是动态的。 与大多数OSGi规范实现一样, ECF项目中的Eclipse相当于分布式OSGi。
Apache Tuscany可用于将OSGi服务连接到非OSGi工件,例如传统的Java,Spring或Web组件。 为此,托斯卡纳支持由OSGi服务实现的SCA(服务组件体系结构)组件。 这样,其他SCA组件可以使用此类服务??,而其他SCA组件不一定要在OSGi中实现。 类似地,定义为SCA组件的OSGi服务可以声明对其他SCA组件的引用,并将其消费为服务,而这些再次不需要在OSGi中实现。
结论
文章摘自Java Tech Journal 。
翻译自: https://jaxenter.com/osgi-a-la-carte-103476.html
osgi
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91333 人正在系统学习中 相关资源:TranslationLoaderBundle:具有数据库翻译加载器的Symfony2捆绑软件
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!