快速业务通道

模块化Java:静态模块化 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

模块化Java:静态模块化

时间:2011-03-29 infoq Alex Blewitt 译:宋玮

模块化是大型Java系统的一个重要特征。在这些项目中构建脚本和项目通常被划分为 多个模块,以便改进构建过程,但是在运行时却很少考虑划分模块的问题。

在“模块化Java”系列文章的第二篇里,我们将讨论静态模块化(static modularity )。内容包括如何创建bundle、将其安装到OSG引擎以及怎样建立bundle之间的版本依赖 。在下一篇文章中,我们将讨论动态模块化(dynamic modularity)并展示bundle如何对 其他bundle作出响应。

在上篇文章《模块化Java简介》中讲到,Java在开发时把package作为模块化单元,部 署时把JAR文件作为模块化单元。可是尽管像Maven这样的构建工具能够在编译时保证 package和JAR的特定组合,但这些依赖在运行时classpath下仍可能出现不一致的情况。 为了解决这一问题,模块可以声明其依赖需求,这样,在运行时就可以在执行之前进行依 赖检查。

OSGi是一个Java的运行时动态模块系统。OSGi规范描述了OSGi运行时的工作行为方式 ;当前版本是OSGi R4.2。

一个OSGi模块(也称为bundle)就是一个普通的JAR文件,但在其MANIFEST.MF中带有 附加信息。一个bundle的manifest必须至少包含如下内容:

Bundle-ManifestVersion:对OSGi R4 bundle来说必须是2(OSGi R3 bundle则默认为 1)

Bundle-SymbolicName:bundle的文本标识符,通常以反向域名的形式出现,如 com.infoq,并且往往对应了包含其中的package

Bundle-Version:major.minor.micro.qualifier形式的版本号,前三个元素是数字( 缺省是0),qualifier则是文本(缺省是空字符串)

创建一个bundle

最简单的bundle必须在manifest文件中包含如下内容:

Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.infoq.minimal Bundle-Version: 1.0.0

创建bundle并没有什么可稀奇的,那么让我们创建一个带activator的bundle吧。下面 是OSGi特定的代码片段,在bundle启动时被调用,有点像是bundle的main方法。

package com.infoq; import org.osgi.framework.*; public class ExampleActivator implements BundleActivator {   public void start(BundleContext context) {    System.out.println("Started");   }   public void stop(BundleContext context) {    System.out.println("Stopped");   } }

为了让OSGi知道哪个类是activator,我们需要在manifest中加入额外的信息项:

Bundle-Activator: com.infoq.ExampleActivator Import-Package: org.osgi.framework

Bundle-Activator声明了在bundle启动时要实例化并调用其start()方法的类;类似的 ,在bundle停止时将调用该类的stop()方法。

那么Import-Package又是干什么的?每个bundle都需要在manifest中定义其依赖,以 便在运行时判断所有必需代码是否可用。在本例中,ExampleActivator依赖于 org.osgi.framework包中的BundleContext;如果我们不在manifext中声明该依赖,在运 行时就会碰到NoClassDefFoundError错误。

模块化Java:静态模块化(2)

时间:2011-03-29 infoq Alex Blewitt 译:宋玮

下载OSGi引擎

要编译并测试我们的bundle,需要一个OSGi引擎。对OSGi R4.2,下面罗列了几个可用 的开源引擎。你也可以下载Reference API来编译(这样可以确保没有用到任何平台特定 特性);可是,要运行bundle,还是需要一个OSGi引擎。以下引擎都可供选择:

Equinox
许可 Eclipse Public License
文献 http://www.eclipse.org/equinox/
下载 org.eclipse.osgi_3.5.0.v20090520.jar
评注 该org.eclipse.osgi bundle包含了框架、运行时和shell,是全部合一的。它 的文件名也最长,用tab补全(或改名为equinox.jar)可以解决这一问题。 要启动console,在命令行输入java -jar org.eclipse.osgi_3.5.0.v20090520.jar -console即可。
框架 org.eclipse.osgi_3.5.0.v20090520.jar
Felix
许可 Apache License
文献 http://felix.apache.org/
下载 Felix Framework Distribution 2.0.0
评注 这是所见遵守规范最严格的OSGi引擎,还被用在GlassFish及许多其他开源产 品中。运行时需要在命令行输入java -jar bin/felix.jar而不是 java -jar felix.jar ,因为启动时它要从当前目录查找bundles 路径。
框架 bin/felix.jar
Knopflerfish
许可 Knopflerfish License (BSD-esque)
文献 http://www.knopflerfish.org/
下载 knopflerfish_fullbin_osgi_2.3.3.jar
评注 该JAR是一个自解压zip文件;刚开始你必须运行java -jar进行解压。不要下 载“bin_osgi”,它无法启动。
框架 knopflerfish.org/osgi/framework.jar

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号