在equinox之上初始化struts 1环境
From Tuscany中文社区
这几天我在eclipse上操作了一下struts1的使用,现在向大家汇报一下(我使用的是eclipse3.3)。取得了一些成绩,也发现了一些问题。
[编辑] 动态发布struts资源
目前,并没有一个成型的struts的extension point,equinox提供的参考做法是通过equinox的java api在用户的activator类里面动态发布struts的ActionServlet。
- 第一步就是创建一个plugin项目,然后在自己的Activator里面添加动态发布代码
上面这个类图中,包test1229是我的plugin使用的类,其中MyActivator是这个plugin的Activator,它的start方法中,增加了这些代码,请参考cvs服务器上的
src/osgi-integate/java/test1229/Activator.java
我同时还需要创建一个org.osgi.util.ServiceTracker的一个子类,并重载其addingService方法。
org.apache.struts.action.ActionServlet的初始化是通过一个“适配器”完成的,equinox提供了这个适配器(图中ContextPathServletAdaptor),但是只有cvs代码可供下载(没有现成的bundle),所以我还创建了另一个plugin(下载的代码结构可以直接在eclipse做import)。
cvs命令行:cvs -d :pserver:anonymous@dev.eclipse.org/cvsroot/eclipse co equinox-incubator/org.eclipse.equinox.http.helper
动态发布代码使用了两次这个适配器,一次是发布org.eclipse.equinox.jsp.jasper.JspServlet(这样,jsp编译器就被映射到*.jsp上);第二次就是发布org.apache.struts.action.ActionServlet。
运行这段代码需要做不少配置工作。详述如下:
[编辑] 运行动态发布代码
以下是我的运行环境中所必需的bundle的列表:
(序号)id State Bundle
- 0 ACTIVE org.eclipse.osgi_3.3.1.R33x_v20070828
- 50 ACTIVE org.eclipse.osgi.services_3.1.200.v20070605
- 55 ACTIVE org.apache.commons.logging_1.0.4.v200706111724
- 73 ACTIVE org.eclipse.osgi.util_3.1.200.v20070605
- 328 ACTIVE org.eclipse.equinox.registry_3.3.1.R33x_v20070802
- 329 ACTIVE org.eclipse.equinox.jsp.jasper.registry_1.0.0.v20070607
- 330 ACTIVE org.eclipse.equinox.http.registry_1.0.0.v20070608
- 331 ACTIVE org.eclipse.equinox.http.servlet_1.0.1.R33x_v20070816
- 332 ACTIVE org.apache.commons.el_1.0.0.v200706111724
- 333 ACTIVE org.eclipse.equinox.jsp.jasper_1.0.1.R33x_v20070816
- 334 ACTIVE javax.servlet.jsp_2.0.0.v200706191603
- 335 ACTIVE javax.servlet_2.4.0.v200706111738
- 337 ACTIVE org.eclipse.equinox.common_3.3.0.v20070426
- 341 ACTIVE org.springframework.osgi.commons-collections.osgi_3.2.0.SNAPSHOT
- 343 ACTIVE org.springframework.osgi.commons-beanutils.osgi_1.7.0.SNAPSHOT
- 344 ACTIVE commons.fileupload_1.0.0
- 347 ACTIVE org.mortbay.jetty_5.1.11.v200706111724
- 349 ACTIVE org.eclipse.equinox.http.jetty_1.0.1.R33x_v20070816
- 358 ACTIVE test1229_1.0.0
- 360 ACTIVE org.springframework.osgi.struts.osgi_1.2.9.SNAPSHOT
- 361 ACTIVE commons.digester_1.0.0
- 363 ACTIVE commons.validator_1.0.0
- 364 ACTIVE org.eclipse.equinox.http.helper_1.0.0
- 365 ACTIVE org.apache.jasper_5.5.17.v200706111724
其中test1229_1.0.0是我自己创建的,其中有本文所介绍的动态struts发布代码,而org.eclipse.equinox.http.helper_1.0.0也是我创建的plugin,但是里面的代码是从equinox-incubator下载的那个适配器的代码。 列表中,org.springframework.osgi.struts.osgi是从spring的网站上下载的,其实它只是在struts1.2.9的jar里面修改了META-INF/MANIFEST.MF的内容,增加了bundle的属性,如import-package和export-package等。 org.springframework.osgi.commons-collections.osgi org.springframework.osgi.commons-beanutils.osgi也是从spring的网站上下载的,其内容和*struts*是一样的。
而commons-digester、commons-validator、commons-fileupload也是启动struts环境所必须的,但是并没有相关的下载。我们只需要将原来的jar文件打开,修改一下META-INF/MANIFEST.MF,增加bundle属性,就OK了。
在我们成功运行这段代码之前,一定会遇到大量的ClassNotFound异常,我们需要注意修改META-INF/MANIFEST.MF文件的Import-package:段落,将找不到的包增加进去。


