spring-dm的web支持
从spring-dm 1.1.0开始,增加了一个主要的特性是对wb应用的支持,这使得部署web程序到osgi变得容易。
在osgi中运行web应用最大的问题是有关资源和类的加载;在web应用中没有绑定空间或者导入包的概念。每个web容器有它自己的类加载继承关系,并且类路径的认定可能和osgi空间冲突。spring-dm通过为web容器和osgi空间桥接来解决这个问题,所以加载不再是问题。功能上独特的是,spring-dm的web支持直接和web容器集成,因此war过程对服务器是完全可控的,包括阻塞io和非阻塞io,线程池,规范的支持(servlet2.3,2.4,2.5)等。支持全部web.xml语法而不需要spring-dm自身做任何解析,也支持所有目标容器自定义的配置文件。一句话,所有目标容器支持的,osgi war通过spring-dm都可用。
osgi绑定和war:war特指对web应用打包的jar。每个war可认为是一个osgi绑定,这还需要定义相应的osgi清单条目。绑定并不要求.jar文件结尾,.war一样可作为绑定安装。
支持的web容器
目前,spring-dm支持tomcat5.5/6和jetty 6.1.8+/6.2。web支持兼容jdk1.4。
使用web支持
WAR和web应用的比较:web应用是war的一个实例。
和非war绑定类似,spring-dm web使用扩展器模式监测和安装war。然而,和标准spring-dm扩展器的一个显著不同是,spring-dm只能用于吃法安装和卸载war,因为实际的web应用的创建和线程管理由web容器管理。这也就是说,spring-dm web只控制向web容器部署和从容器删除war;由web容器创建和管理相应的web应用。
使用spring-dm,安装:
- spring-osgi-web.jar – spring-dm web支持;
spring-osgi-web-extender.jar– spring-dm web扩展器。
绑定检查一起动的osgi war绑定(.war扩展名的绑定)并将他们部署到一个支持的web容器中。默认情况,将使用tomcat,不过可以更换为其他自定义服务器比如jetty。当war绑定已停止,spring-dm将停止并卸载与之相关的web应用。和通常web部署不同,servlet类需要显式的作为osgi类路径导入。
当运行一个web应用,它的web容器可启动和实例化它,不需要spring的在META-INF/spring下的.xml文件或者使用spring-dm清单条目。可简单的绑定你所需文件到war,而后通过你使用的web框架启动spring容器。
在osgi中的war类路径
servlet规范定义了war中一系列规则和位置。以下解释这些规范在osgi环境中的处理。
静态资源
当安装一个war绑定时,对于静态资源,spring-dm只认识绑定空间中可用的,WEB-INF目录下资源只能通过ServletContext访问,对远程访问不可见。另外任何类路径下资源可被该应用程序的代码使用,但对外不可见。
servlet
和通常war部署的一个主要区别是,servlet包需要导入才可对war绑定可用。做到这点,在Import-Package条目中增加如下包:
Import-Package: javax.servlet,javax.servlet.http,javax.servlet.resources
另外,servlet规范定义了war的类路径,基于预置的位置:
- WEB-INF/classes
- WEB-INF/lib/*.jar
而且,每个容器的实现可能提供添加到war类路径的公用类库。因为osgi对war所属类的关联、版本控制、重加载,spring-dm将忽略war预置的位置并总是使用osgi类路径实例。这意味着,war绑定导入的类可使用不在WEB-INF/classes文件夹或者WEB-INF/lib下的jar。这也表明,如果在war osgi类路径不可用的任何类,WEB-INF/classes目录下的该类不被识别。
增加对war预定义位置支持最简单的办法是,将这些加入绑定清单:
Bundle-Classpath: .,WEB-INF/classes,WEB-INF/lib/some.jar,WEB-INF/lib/lib.jar
需要确认的是默认Bundle-Classpath位置(.)要加上,逗号之间没有空格。
注意:目前osgi API没有提供绑定处理前的回调,spring-dm不能提供可靠的自动化这个过程的方式。然而,我们正在寻找合适的解决方法。bnd工具可以在打包期间增加这些条目。
在为嵌入的库创建条目前,需考虑是否可将他们安装为osgi绑定,这样他们可以让其他war共享,并且osgi可进行版本控制,多版本的同一个库,可在同一个vm中很好的共存。
JSP
对于jsp,spring-dm集成了tomcat jasper2引擎,可支持jsp1.2,2.0和2.1。osgi版本的jasper可在spring-dm osgi仓库中找到。不需要为osgi绑定导入jasper类。
标签库
JSP规范允许创建标签库。spring-dm扩展了jsp的约定,标签库可放置在war类路径或者导入包或者最为绑定。
spring-dm自动查找绑定中可用的tld,并使之对jasper引擎可用。tag定义是自动查找的,而标签类则不是,不过,osgi类路径优先。
当处理类库导出的大量标签时,可使用Require-Bundle代替Import-Package导入标签:
Require-Bundle: org.springframework.osgi.jstl.osgi
用上面的清单条目,JSTL所有类,可被war绑定访问。
警告:在大规模使用Require-Bundle前,阅读osgi规范(3.13)深入了解隐含的语义。
配置web扩展器
略。
这篇文章上的评论的 RSS feed TrackBack URI