MyException - 我的异常网
当前位置:我的异常网» 操作系统 » 基于 OSGi的企业级开发框架实践——开发框架的创设

基于 OSGi的企业级开发框架实践——开发框架的创设

www.MyException.Cn  网友分享于:2015-08-26  浏览:10次
基于 OSGi的企业级开发框架实践——开发框架的创建

终于到了主角登场的时刻了!之前化了不少笔墨介绍有关OSGi和Spring DM框架的内容,目的就是为了我们开发框架的出场做铺垫。在序篇中我已经介绍了做为开发框架所应具备的要素。其中最为关键的是要为开发人员提供一套统一的编程模型或称其为开发模板。所有开发人员通过遵循统一的开发标准就可以极大的提高开发效率和质量。

基于OSGi的开发与普通的Java或是Web开发有着不同的项目组织结构。因为OSGi崇尚的是模块化,因此,它的项目组织结构会变得稍微复杂一点,下图展示了基于OSGi开发框架所生成的项目组织结构:


(图一)

从上图中我们可以发现,基于OSGi的开发框架是由一系列的Java项目组成的,每个项目就是一个Bundle。开发框架按照系统的一般功能预置了一些最基础的Bundle,比如,helloworld-common-dal,这个Bundle就是专门负责提供与数据库操作相关的服务(其实就是DAL层)。每个bundle都各司其职并相互协作,最终构成了整个系统的完整功能。当然,开发框架只提供了最最基本的Bundle,你也可以在此基础上追加其他功能的bundle。在下一篇文章中我会详细介绍开发框架提供的每个Bundle的具体职能。

看到这里你可能会觉得疑惑,这么复杂的项目结构每次都靠手工来创建?这种纯体力活谁愿意干!的确,如果每次都要从头创建这样一套基于OSGi的开发框架模板,那我就没必要在这里写这篇文章了。开发框架会提供工具给开发人员,自动的生成开发框架模板。自动化工具是基于Maven插件的,生成的开发框架模板除了提供Bundle的组织结构外,还提供了系统运行所必须的基本配置。

接下来我们就开始创建开发框架模板。首先你的系统中必须安装Maven工具。由于Maven的安装和使用不是我们这系列文章所关注的内容,所以请各位同学自行到网上去查看相关的文章介绍。这里我假设你已经安装了Maven并且可以熟练的操作它。

生成开发框架模板需要一个pom.xml文件,该文件中定义了插件的基本信息。点击这里可以下载它。将下载的文件解压缩,会得到一个pom.xml文件,将其放在任意目录下,比如:D:\test。然后点击这里下载一个Eclipse的workspaces目录。将下载的文件解压缩,会得到一个workspaces文件夹,将其放在与之前下载的pom.xml文件同级的目录中,最终结果如下图所示:


(图二)


接下来我们打开一个命令行窗口,并将当前目录切换到存放pom.xml文件的目录下(本例中是D:\test),如下图所示:


(图三)

最后在当前命令行下输入如下命令:

mvn storevm:gencore -Dapp.name=helloworld
其中app.name参数是应用程序的名称,还有其他几个可选参数,完整的命令行如下所示:

mvn storevm:gencore -Dapp.name=helloworld -Dpackage.name=org.storevm -Dversion=1.0.0 -Durl=http://www.storevm.org
其中package.name参数表示每个Bundle的基础package名称(默认值为org.storevm),version参数表示Bundle的版本号(默认值为1.0.0),url参数表示pom.xml文件中的url属性(默认值为http://www.storevm.org)。

当看到命令行窗口中显示如下图所示的内容时表示生成OSGi开发框架模板成功了:


(图四)

然后我们回到项目根目录下(D:\test)看一下是否真的已经生成了框架模板,如下图所示:


(图五)

从上图中我们可以发现,项目目录已经生成了(红色框中所示),另外还会生成一个velocity.log文件,这是插件运行时生成的velocity日志文件,我们可以安全的删除它。至此基于OSGi的开发框架模板就创建完成了,接下来让我们来看看框架模板中有些什么东西以及如何导入到我们的开发工具中,如:Eclipse。

当你打开框架模板目录后,会看到如下图所示的目录结构:


(图六)

整个开发框架是遵循Maven项目结构的,所以诸如打包,部署等都是依赖Maven工具的,所以这里再次提醒各位同学,如果对Maven不了解,请尽快去补习一下相关的知识。开发框架一共由4个目录组成,其中app目录是主应用程序目录,所有代码都写在这个目录中。assembly目录是应用程序的最终部署目录,当我们开发完成之后,运行Maven的打包安装命令就可以将源代码编译打包成jar文件并按照一定的组织方式自动的部署到assembly目录中,最后运行该目录中的启动脚本(startup.sh),就可以运行OSGi应用程序了。config目录中是一些Fragment类型的Bundle,用于配置应用程序的默认参数值,比如日志,分布式事务,Jetty容器等等。如果你不了解什么是Fragment Bundle,就去看看上一篇文章(认识OSGI和Spring DM)中关于Fragment Bundle的介绍。web目录是标准Web应用程序目录,用于提供OSGi应用程序的UI界面。当然如果你的应用程序不需要UI,则可以忽视它的存在。在我们的OSGi开发框架中,UI界面是独立的Web程序,它和OSGi应用程序运行在2个独立的JVM中,所以他们之间只能通过远程通讯来完成交互,目前我们使用的是Hessian。至于为什么要这么搞,你可以回过头去看看序篇中的介绍就明白了。这样做的第二个好处是,OSGi应用程序可以分布式部署,比如:应用程序的主要运算集中在OSGi上,而我的服务器可能只是区区5台(或是一台服务器上的5个虚拟机),这时我就可以把OSGi程序部署在4台服务器上,而把UI程序部署在另外1台服务器上,然后通过开发框架提供的分布式服务配置,就可以完成OSGi的分布式部署了(关于OSGi的分布式部署在后续的文章中会有介绍)。现在你可以随意的浏览各个目录或其下的子目录,看看还有什么其他令人兴奋的东西,可惜除了目录套目录,什么都没有。那这么把这一坨目录导入到我们的IDE中呢?接下去,我们就开始使用Maven工具来生成项目结构。

如果你还在浏览目录,则先将目录切换到应用程序的根目录下,例如:D:\test\helloworld。我们再次打开一个命令行窗口,并将当前目录切换到应用程序根目录下(本例中的目录为D:\test\helloworld),然后在该目录下键入如下Maven命令:

mvn clean install -Dmaven.test.skip=true
这是Maven的安装命令,今后我们会经常的使用到它,所以请同学们记住它的长相,这里我们先执行一次,目的是为了生成OSGi运行所需要的第三方Bundle(非常的多,请淡定)。接着,命令行窗口开始快速的滚屏,如果你是第一次执行Maven,可能需要从中央仓库下载JAR包,所以整个过程会比较的漫长,请耐心的等待。当看到命令行窗口中输出如下内容时表示执行成功:

 (图七)

此时我们再次回到assembly目录,看看发生了什么变化,如下图所示:

(图八)

在该目录中增加了不少目录,这些目录中存放着许多Jar包,这些Jar包是OSGi应用程序正确运行所必须的第三方Bundle,之后我们需要将这些Bundle导入到Eclipse中,用于创建OSGi运行时环境。从目录名称我们大致可以知道目录中JAR包的用途,如果有兴趣,你可以自行浏览一下,这里就不再赘述了。

接下去我们要生成Eclipse项目结构了,我们在之前的命令行窗口中继续输入如下命令(不要切换目录):

mvn eclipse:eclipse
命令行窗口再次的快速滚屏,当出现和“图七”类似的内容时表示创建Eclipse项目完成,此时我们可以启动Eclipse IDE了。当出现选择workspaces的窗口时请选择之前我们下载来的那个workspaces目录(D:\test\workspaces),如下图所示:

(图九)

黄色标记出来的请不要选中(请注意,在多项目开发的情况下,我们一般都不会选中该选项)。然后点击OK按钮,Eclipse IDE开始加载启动。接下去,我们在Eclipse中先导入那一大坨第三方Bundle。在Eclipse中选择“File->Import...”菜单,会弹出Import窗体。在该窗体中选中“Plug-ins and Fragments”选项,然后点击“next”按钮。如下图所示(这里要注意,你的Eclipse必须要支持Eclipse插件的开发,否则就会看不到这个选项):

(图十)

在“Import Plug-ins and Fragments”窗体上选中“Import From”框中的“Directory”单选框,然后点击“Browse...”按钮,在弹出的“Plug-in Directory”窗体中选择assembly目录中的第三方Bundle目录,如下图所示:

(图十一)

点击“next”按钮,进入到“Selection”窗体,在该窗体中点击“Add All”按钮,将Bundle从左边窗口移到右边窗口。完成之后点击“ Finish”按钮。如下图所示:

(图十二)

到此导入第三方Bundle完成。用同样的方法,将assembly目录中的其他几个第三方Bundle也导入到Eclipse中(要导入的目录有:activemq,equinox,jetty,logging,spring,springdm,tools,web,xa。其中configuration和core中的Bundle不需要导入,切记!)。导入完成之后, Eclipse界面如下图所示:

(图十三)

由于篇幅的关系,这里只能列出一小部分。好了,第三方Bundle都已经导入了,接下去要导入我们的应用程序Bundle了。点击“File->Import...”菜单项,在弹出的Import窗体中选择“Existing Projects into Workspace”选项,然后点击“next”按钮,如下图所示:


(图十四)

在弹出的“Import Projects”窗体上选中“Select root directory”单选框,并点击“Browse...”按钮,在弹出的窗体中选择应用程序根目录,如下图所示:

(图十五)

然后会在“Projects”列表框中显示出所有可以导入的项目,接着我们选中“Add project to working sets”复选框,再点击“Select...”按钮,然后在弹出的窗体上点击“New...”按钮,在弹出的窗口中选择“Java”,然后点击“next”按钮,如下图所示:

(图十六)

最后在弹出的窗体中输入Working sets的名称,例如:helloworld。点击“Finish”按钮完成,如下图所示:

(图十七)

此时又回到“Select Working Sets”窗体,请选中刚才添加的Working Sets,然后点击“OK”按钮,如下图所示:

(图十八)

最后点击“Finish”按钮,完成项目的导入。最后结果如下图所示:

(图十九)

至此创建OSGi开发框架就算大功告成了。你可以随意的浏览一下每个项目中都包含些什么。在下一篇文章中,我们将介绍OSGi开发框架的基本结构以及各Bundle之间的依赖关系,只有在了解了这些内容之后,我们才能正式的进入编码阶段。

文章评论

每天工作4小时的程序员
每天工作4小时的程序员
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员必看的十大电影
程序员必看的十大电影
我的丈夫是个程序员
我的丈夫是个程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
10个调试和排错的小建议
10个调试和排错的小建议
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
如何成为一名黑客
如何成为一名黑客
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
编程语言是女人
编程语言是女人
老程序员的下场
老程序员的下场
那些争议最大的编程观点
那些争议最大的编程观点
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员和编码员之间的区别
程序员和编码员之间的区别
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
旅行,写作,编程
旅行,写作,编程
鲜为人知的编程真相
鲜为人知的编程真相
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
中美印日四国程序员比较
中美印日四国程序员比较
程序员都该阅读的书
程序员都该阅读的书
代码女神横空出世
代码女神横空出世
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
漫画:程序员的工作
漫画:程序员的工作
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员的鄙视链
程序员的鄙视链
我是如何打败拖延症的
我是如何打败拖延症的
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有