最近在看去年买的一本叫作《OSGI原理与最佳实践》一书,在书中的第三章讲到一篇如何运行一个建立在springdm上的petstore程序。经过反复的出错和实践,终于按照书上的相关步骤弄出一个可以运行的例子。
书上所用的springdm为1.0版,而我这里用的是spring2.0 m1版,所以有些地方的配置可能和书上不一致。
首先准备以下文件:
Bootstrap
ProductDal
ProductList
ProductManagement
ShoppingCart
ShoppingCartDal
utils
以上这些文件是从相应的source中直接导入到eclipse中,由于使用的是默认的编译选项,所以需要修改默认的Bundle-ClassPath,默认的是相应的工程名, 我这里修改为/bin(即eclipse默认的编译输出目录)。
接下来,导入相应的springdm2.0的相应包
1),
org.springframework.osgi.core
org.springframework.osgi.extender
org.springframework.osgi.io
org.springframework.osgi.web
org.springframework.osgi.web.extender
2),
org.springframework.osgi.jetty.start.osgi
org.springframework.osgi.jetty.web.extender
3),
org.springsource.javax.servlet
org.springsource.net.sf.cglib
org.springsource.org.aopalliance
org.springsource.org.apache.log4j
org.springsource.org.objectweb.asm
org.springsource.slf4j.api
org.springsource.slf4j.log4j
org.springsource.slf4j.org.apache.commons.logging
4),
org.mortbay.jetty.server
org.mortbay.jetty.util
以上的相应包均从springdm2.0的dist和相应的lib包导入到eclipse中,其中第1部分从dist目录导入,第2部分,导入springdm与jetty融合的相应配置包,第3部分为相应运行所依赖的相应包,第4部分为jetty的运行服务器。这里需要注意的是不要导入eclipse所自带的jetty包,因为第2部分的包要求所依赖的jetty包的版本为6.1.9(即springdm自带的jetty包)。
接下来,导入spring的相应包,此处的spring要求为3.0以上的版本(因为springdm2.0要求spring的相关包,版本为[3.0,4.0)),下载相应的spring包,导入以下包
org.springframework.aop
org.springframework.asm
org.springframework.beans
org.springframework.context
org.springframework.context.support
org.springframework.core
org.springframework.expression
org.springframework.jdbc
org.springframework.transaction
org.springframework.web
导入完毕之后,设置工程中(即petstore)中所缺少的相应部分。配置运行时的包,即引用equinox的相应包,引用的包如下:
现在可以运行了,运行之后,输入网址:http://localhost/petstore/app即可访问了。有一个问题就是,如果观看运行的终端,可以看到jetty启动了两个console,一个为默认的80,另一个为8080,其中第一个为org.eclipse.equinox.http.jetty提供的默认80,另一个为org.springframework.osgi.jetty.start.osgi提供的8080。如果把后一个去掉,则会在运行中报一个有关jetty没有成为相应的service的错误(不知道为什么)。
配置过程中,出现了很多问题,比如servlet中无论如何也没有注入相应的httpService,最后才发现没有导入httpService的启动包,即(org.eclipse.equinox.http.jetty,它调用了由org.eclipse.quinox.http.servlet实现的httpserviceImpl,从而实现了org.eclipse.osgi.services,但这个实现类是由http.jetty包来启动的)。详细启动逻辑见http://flym.iteye.com/blog/687216。
OK,终于算是启动成功了,接下来,得好好研究下springdm。不过感觉这一个工程所导入的jar也太多了吧,可能是由于刚开始做osgi的工程,以前弄一大堆jar包习惯还没有改变过来。