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

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

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第1张图片

(图一)

从上图中我们可以发现,基于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文件同级的目录中,最终结果如下图所示:

基于 OSGi的企业级开发框架实践——开发框架的创建_第2张图片

(图二)


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

基于 OSGi的企业级开发框架实践——开发框架的创建_第3张图片

(图三)

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

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开发框架模板成功了:

基于 OSGi的企业级开发框架实践——开发框架的创建_第4张图片

(图四)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第5张图片

(图五)

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

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第6张图片

(图六)

整个开发框架是遵循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工具来生成Java项目结构。

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

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第7张图片

 (图七)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第8张图片

(图八)

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

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

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第9张图片

(图九)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第10张图片

(图十)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第11张图片

(图十一)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第12张图片

(图十二)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第13张图片

(图十三)

可能你看到的并不像图十三所展示的那样,那请你点击“View Menu”,在弹出的下拉菜单中选择“Configure Working Sets...”菜单项,如下图所示:

基于 OSGi的企业级开发框架实践——开发框架的创建_第14张图片

(图十四)

在弹出的“Configure Working Sets”对话框中将“Other Projects”选项选中,最后点击Ok按钮完成。如下图所示:

基于 OSGi的企业级开发框架实践——开发框架的创建_第15张图片

(图十五)

此时,我们就能看到如“图十三”所展示的样子了。由于篇幅的关系,这里只展示了一个目录下的第三方Bundle的导入,其他目录下的Bundle导入方式都是完全一样的。接下去我们要导入开发框架模板了。点击“File->Import...”菜单项,在弹出的Import窗体中选择“Existing Projects into Workspace”选项,然后点击“next”按钮,如下图所示:

基于 OSGi的企业级开发框架实践——开发框架的创建_第16张图片

(图十六)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第17张图片

(图十七)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第18张图片

(图十八)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第19张图片

(图十九)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第20张图片

(图二十)

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

基于 OSGi的企业级开发框架实践——开发框架的创建_第21张图片

(图二十一)

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

你可能感兴趣的:(spring,osgi)