`
georgezeng
  • 浏览: 103442 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

OSGI下的web应用开发(3)

阅读更多

上节讲了如何对web应用进行大体的模块划分,现在开始进入正题,对本次应用进行开发。

首先需要知道应用最终有几个模块,如图


一共分为7个bundle,其中5个bundle上一节已经讲过了,为了让整个系统能够真正的运行起来,还需要domain bundle和datasource bundle。

domain bundle是将所有的域对象定义到一个模块中,这样可以被其余的任何模块进行访问,它是被除了datasource bundle外的所有模块所访问的,这里省略连接线;

datasource bundle是将datasource进行配置并以OSGI服务的方式发布,如果其它的模块需要直接访问datasource的时候,就引入该模块。

 

That‘s it!让我们开始进入开发!

 

Note:后面所有用到的bundle都可以到这个地址下载

http://ebr.springsource.com/repository/app/

这个是spring提供的庞大的第三方bundle的库,方便我们索取,不然就需要我们自己通过修改第三方的jar包将其变成一个bundle,这在有些时候是很可怕且繁琐且容易出错的操作!

 

除了Web bundle,其余的bundle都将是一个Spring DM Bundle,所以会spring的bundle project方式进行开发。

 

DataSource Bundle的开发

 

建议在spring perspective下进行开发,这也是STS的默认perspective,如图所示。


(1)新建一个Bundle Project,点击菜单new>>project,进入下图的对话框



 
 选择Bundle Project,然后点击Next,进入下图


输入project名,这里推荐使用顶层的包名作为项目名,便于查找维护项目。然后点击Next,进入下图



 symbolic-name会默认使用项目名,这里不需要做改变了,bundle name可以自行修改,只是用于描述而已。

Bundle version默认是1.0.0,也可以不用改。Modle Type不用选择,记得勾选Enable Bundle Classpath Container,这样才能引用其它的bundle进行import关联。target runtime也不需要管它,再次点击Next



 
 这里的class输出目录不需要做改变,默认就可以了,然后点击Finish,project 建立。

 

由于Datasource bundle只是配置一个可用的数据源并将它作为OSGI服务发布,所以这个工程下是没有源代码的,只有配置文件。项目的结构图如下



 
 项目默认会在src目录中生成META-INF目录,和MANIFEST.MF文件。为了让bundle成为一个spring bundle,我们需要在META-INF目录下创建spring目录,这样virgo server就能认出这个bundle是一个spring-powered bundle。

一般在spring目录下会有两个文件,一个是appContext.xml文件,另一个则是osgi-context.xml文件。其中appContext.xml文件用于配置当前bundle内定义的所有的bean,然后通过osgi-context.xml文件进行服务的发布或者引用。

 

(1)appContext.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
	xmlns:p="http://www.springframework.org/schema/p">

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		p:driverClassName="com.mysql.jdbc.Driver"
		p:url="jdbc:mysql://localhost:3306/test?autoReconnect=true"
		p:username="root" p:password="111111" init-method="createDataSource"
		destroy-method="close" />

</beans>
 

 

这里定义了datasource的bean。

 

(2)osgi-context.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/osgi
		http://www.springframework.org/schema/osgi/spring-osgi.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<osgi:service ref="dataSource" interface="javax.sql.DataSource"/>
		

</beans>

 

 

这里将定义好的datasource bean作为OSGI服务发布。

 

(3)MANIFEST.MF

我们还需要对此文件进行相应的配置才能让bundle正常发布运行,通过STS我们可以很方便的对这个文件进行编辑,尽量不要自己手动使用文本编辑该文件,因为它有很多格式限制。

如图


MANIFEST.MF打开后的编辑界面共有4个标签,分别Overview,Dependencies,Runtime, MANIFEST.MF

其中Overview就是对bundle的大致描述,比如可以编辑bundle-symbolic name(即ID),还有version等信息;

Dependencies则是用于配置import的依赖关系

Runtime则是用于设置export和bundle classpath的内容

而MANIFEST.MF则是最终生成的内容的文本内容,即文件的真面目。

 



 
 上图是dependencies的内容,可以看到有3个panel,分别是Import Package,Import Bundle和Import Library,每个panel都有4个按钮,Add,Download,Remove和Properties。

其中Import Bundle和Import Library是virgo server提供的,与Require-Bundle的头信息是不一样的,这两个内容实际上是为了简化Import Package,因为你可能会使用一个bundle中很多的package,

如果你一个个引入就很繁琐,你可以直接对整个bundle进行引入,当virgo遇到这个头信息时会将它自动拆解到Import Package中,所以这3个Import最终都会变成Import Package中的内容。所以Import Library是对一些bundle进行引入,而不用每个bundle来引入,这需要使用后缀名为.libd的文件来引入。spring本身提供了一个.libd文件用来引入整个spring库。

 

请记住,Import Bundle的内容和Import Library的内容最终还是会变成Import Package中的内容,所以跟OSGI中的Require-Bundle是不一样的。

 

4个按钮的作用分别是:

1)Add

用来添加可以查找到的package,bundle或者library

那么它是查找哪个位置的呢?它是查找virgo server的目录下的repository目录的,这里是用于存放virgo server运行时相关的bundle的地方,所以如果你有新的bundle(不管是第三方的还是自己的)需要引用,你需要将它bundle放置到repository目录中的某个子目录中(这个目录默认有两个子目录,一个是ext,一个是usr,推荐将bundle都放入ext中,或者重新配置usr的读取属性再放入usr中,这个内容将在后面如何操作virgo server的章节中详细介绍)。

 

2)Download

如果你没有需要的bundle,那么可以通过download去下载你需要的,不过不推荐在这里下载,这个按钮可以不管。

 

3)Remove

有添加就肯定可以移除,这个按钮就是用于移除你不需要的依赖引入。

 

4)Properties

这个按钮是用于编辑某个import的版本的范围和是否是optional的(即解析的时候是否忽略这个依赖的检查)

 

在Datasource bundle中,我们需要引入图中的package才能正常使用此bundle

 

(3.3)Runtime


如图,有2个panel,一个是Exported Packages,一个是Classpath

其中Exported Packages是用于曝露该bundle内的package给其它bundle进行import的,classpath panel则是设置Bundle-Classpath这个头信息的,它的内容是可以排序的,编辑的内容是属于本bundle内的目录路径或者是jar包。

 

Exported Packages中的4个按钮

 

1)Add

曝露bundle内的package

 

2)Remove

可增加就可以删除

 

3)Properteies

用于编辑曝露的package的版本

 

4)Caclculate Uses

跟import中的uses指令有关系的

 

这里Datasource bundle不需要配置任何的export

 

(3.4)MANIFEST.MF标签

通过上面的配置生成最终的内容如下图

 


至此,Datasource Bundle的开发就完成了。

 

这里附上当前项目的源代码

  • 大小: 28.1 KB
  • 大小: 7 KB
  • 大小: 50.2 KB
  • 大小: 90.1 KB
  • 大小: 75.5 KB
  • 大小: 95.8 KB
  • 大小: 19.9 KB
  • 大小: 195.6 KB
  • 大小: 92.8 KB
  • 大小: 38.8 KB
  • 大小: 77.8 KB
4
0
分享到:
评论
6 楼 zyz251314 2012-07-09  
macroping 写道
请问你的工程中 Bundle Dependencies[...]这个依赖库是怎么出来的?
我创建Bundle Project工程后,没有这个依赖库。谢谢。




也碰到相同的问题  等待中。。。。。
5 楼 macroping 2012-03-14  
请问你的工程中 Bundle Dependencies[...]这个依赖库是怎么出来的?
我创建Bundle Project工程后,没有这个依赖库。谢谢。
4 楼 georgezeng 2011-12-29  
huangcanqin 写道
我部署datasource bundle, 出现这个错误:Resolver report:
        An Import-Package could not be resolved. Caused by missing constraint in bundle <net.georgezeng.test.datasource_1.0.0>
             constraint: <Import-Package: org.apache.commons.dbcp; version="[1.2.2.osgi,1.2.2.osgi]">
        An Import-Package could not be resolved. Caused by missing constraint in bundle <com.springsource.org.apache.commons.dbcp_1.2.2.osgi>
             constraint: <Import-Package: org.apache.commons.pool; version="[1.3.0,2.0.0)">
我加了 这个后  org.apache.commons.pool;version="[1.4.0,1.4.0]",重新部署了,也还是错误的,错误信息:  Resolver report:
        An Import-Package could not be resolved. Caused by missing constraint in bundle <net.georgezeng.test.datasource_1.0.0>
             constraint: <Import-Package: org.apache.commons.dbcp; version="[1.2.2.osgi,1.2.2.osgi]">
        An Import-Package could not be resolved. Caused by missing constraint in bundle <com.springsource.org.apache.commons.dbcp_1.2.2.osgi>
             constraint: <Import-Package: org.apache.commons.pool; version="[1.3.0,2.0.0)"> 怎么回事 ?



可能需要具体分析了,你可以加到这个群150023448交流一下
3 楼 huangcanqin 2011-12-28  
我部署datasource bundle, 出现这个错误:Resolver report:
        An Import-Package could not be resolved. Caused by missing constraint in bundle <net.georgezeng.test.datasource_1.0.0>
             constraint: <Import-Package: org.apache.commons.dbcp; version="[1.2.2.osgi,1.2.2.osgi]">
        An Import-Package could not be resolved. Caused by missing constraint in bundle <com.springsource.org.apache.commons.dbcp_1.2.2.osgi>
             constraint: <Import-Package: org.apache.commons.pool; version="[1.3.0,2.0.0)">
我加了 这个后  org.apache.commons.pool;version="[1.4.0,1.4.0]",重新部署了,也还是错误的,错误信息:  Resolver report:
        An Import-Package could not be resolved. Caused by missing constraint in bundle <net.georgezeng.test.datasource_1.0.0>
             constraint: <Import-Package: org.apache.commons.dbcp; version="[1.2.2.osgi,1.2.2.osgi]">
        An Import-Package could not be resolved. Caused by missing constraint in bundle <com.springsource.org.apache.commons.dbcp_1.2.2.osgi>
             constraint: <Import-Package: org.apache.commons.pool; version="[1.3.0,2.0.0)"> 怎么回事 ?
2 楼 georgezeng 2011-12-25  
huangcanqin 写道
不知道你能不能从这http://ebr.springsource.com/repository/app/下载的第三方bundle的库,我下载不了,用maven也下载不了的,需要help。


可以呢,如果实在不行你可以在eclispe里的virgo插件的server面板中选择Repository标签,然后在那里直接下载到virgo的库里
1 楼 huangcanqin 2011-12-25  
不知道你能不能从这http://ebr.springsource.com/repository/app/下载的第三方bundle的库,我下载不了,用maven也下载不了的,需要help。

相关推荐

    基于OSGi和Spring开发Web应用.doc

    "基于OSGi和Spring开发Web应用" OSGi(Open Service Gateway Initiative)是一种面向服务的框架,能够提供动态模块部署和管理的能力。Spring 是一个轻量级的J2EE开发框架,特点是面向接口编程和非侵入式的依赖注入...

    基于OSGi的Web应用开发系列(全).pdf

    **基于OSGi的Web应用开发**是现代软件开发中的一种技术实践,它允许开发者构建模块化、可扩展和可维护的Web应用。OSGi(Open Service Gateway Initiative)是一种开放的标准,提供了一种服务导向的、模块化的Java...

    基于OSGi和Spring开发Web应用

    综上所述,基于OSGi和Spring开发Web应用不仅能够充分利用OSGi的模块化优势和Spring的依赖注入机制,还能借助dmServer和SpringSource应用平台等工具,实现更加高效、灵活和可靠的企业级应用开发。

    基于OSGi和Spring开发Web应用教程

    总的来说,基于OSGi和Spring的Web应用开发结合了两者的优点:OSGi提供了模块化和动态部署的能力,而Spring则带来了方便的依赖管理和服务注册。通过Spring-DM,开发者可以在OSGi环境中享受到Spring的便利,构建更灵活...

    行业分类-设备装置-基于OSGi的Web应用开发平台权限管理自适应设计方法.zip

    在基于OSGi的Web应用开发平台中,权限管理涉及到用户、角色和资源的控制。传统的权限管理通常采用固定的角色-权限模型,但在自适应设计中,系统需要根据用户的行为、环境或者业务需求动态调整权限分配。这通常通过...

    OSGi与Web容器的整合

    将OSGi与Web容器整合,可以实现更加灵活和模块化的Web应用开发和部署。 **1. OSGi Bundle放入Web容器中运行** 这是通过像Equinox的Servlet Bridge这样的技术实现的,它充当了一个桥梁,让OSGi Bundle可以在传统的...

    基于OSGi和Spring开发Web应用的Demo

    在基于OSGi和Spring的Web应用开发中,通常会将业务逻辑、服务接口和Web层分别封装在不同的模块中。根据压缩包子文件的文件名称,我们可以推测这些文件可能代表了这样的模块结构: 1. `...

    基于OSGI的Web开发例子

    在OSGi环境下开发Web应用的好处在于,我们可以独立更新和管理各个组件,避免了传统的Web应用中常见的类加载冲突问题,同时也简化了依赖管理。通过使用Equinox这样的强大框架,我们可以更好地利用OSGi的优势,实现...

    开发一个简单的 OSGi Web 应用实例

    本教程旨在通过一个具体的示例来介绍如何使用OSGi框架开发一个简单的Web应用。这个示例应用能够计算两个数字的和或乘积,并展示了OSGi bundle的动态部署特性。 #### 二、项目背景及目标 **背景:** OSGi (Open ...

    基于OSGi和Spring开发企业级Web应用

    ### 基于OSGi和Spring开发企业级Web应用 #### OSGi与Spring结合的重要性 ...综上所述,将OSGi和Spring结合起来使用,可以有效地解决企业级应用开发中面临的许多挑战,是一种值得推广的技术方案。

    基于 OSGi 和 Spring 开发 Web 应用

    基于 OSGi 和 Spring 开发 Web 应用

    基于VirgoServer进行Spring Osgi Web开发

    在本文中,我们将深入探讨如何基于VirgoServer进行Spring Osgi Web开发,这是一个涉及OSGi容器、Spring框架和Web应用程序的集成技术。首先,我们需要确保拥有正确的开发环境和工具,包括Spring Tool Suite (STS),...

    osgi 在web容器中部署

    这些工具可以将OSGi环境集成到Tomcat中,允许OSGi bundles作为Web应用的一部分运行。 Apache Felix WebConsole是一个基于Web的管理界面,可以用来管理和控制OSGi环境。你可以将其作为一个OSGi bundle部署到Tomcat中...

    自己开发的OSGi Web Console

    1、自己开发的OSGi Web Console,适用于实现了OSGi规范的Equinox、Felix等...2、展示了如何把OSGi框架作为一个组件嵌入到现有的未基于OSGi开发的Web应用当中,在Web应用中可获取OSGi中的Service以增加应用的灵活性。

    OSGI中包含web服务器配置需要的jar.zip

    6. **开发和部署**: 使用这些jar文件,开发者可以按照博客"OSGi环境下建立Web工程的Hello World"中的步骤,创建并部署OSGI兼容的Web应用。这通常涉及编写bundle的MANIFEST.MF文件来声明导出和导入的包,以及如何配置...

    OSGi Web示例工程

    3. **Web Bundle**:在OSGi环境中,Web应用程序被封装为Web Bundle,它可以包含Servlet、Filter、Listener等Web组件。这些组件通过OSGi服务注册,以便其他bundle可以发现并使用它们。 4. **部署和配置**:在OSGi...

Global site tag (gtag.js) - Google Analytics