【适用范围】
通用
【问题描述和定位】
在EOS5.3项目的bizlet中写了一个类,在EOS5.3的开发环境中访问没任何问题,部署到WAS6.0上,通过前台页面访问时报错,从日志中看到这样的Exception:
[07-10-24 21:19:33:456 CST] 00000043 WebApp E SRVE0026E: [Servlet 错误]-[webDriver]:java.lang.NoClassDefFoundError: com/primeton/tp/web/driver/webdriver/WebDriver
at com.primeton.eos.cewolf.tag.DatasetProducerTag.doStartTag(DatasetProducerTag.java:59)
at com.ibm._jsp._ShowImage._jspx_meth_fbcewolf_datasetProducer_0(_ShowImage.java:312)
at com.ibm._jsp._ShowImage._jspService(_ShowImage.ja...
看错误信息,很明显是找不到类com.primeton.tp.web.driver.webdriver.WebDriver的缘故。那为什么在开发环境没有出错,部署到WAS上会出错呢?
这是因为WAS的类加载有严格的层次机制,以WAS5.1为例,先加载系统类WebSphere/AppServer/lib,接着加载应用类eos4ws.ear/lib,最后加载Web层的类eos4ws.ear/default.war/WEB-INF/lib。
自己写的类中import了com.primeton.tp.web.driver.webdriver.WebDriver,WebDriver在/default.war/WEB-INF/lib目录中的,对WAS而言,它的class目录层次最低,加载bizlet层的类时,它还没有被加载,所以会出错。
开发环境中没有出错的原因是采用了Jboss3应用服务器作为调试Server,Jboss3比较特殊,在deploy\jbossweb-tomcat50.sar\META-INF\jboss-service.xml 中提供了一个配置项“UseJBossWebLoader”,将它设置为true以后,会导致不同web应用下的class可见,从而\jboss-3.2.5\server\default\lib中的类可以调用到WEB-INF目录下的类,具体描述可以参见如下链接,我们建议尽量避免使用这种情况,因为当不同的应用中拥有同样的类和资源的时候,不同应用之间会产生冲突:
http://gocom.primeton.com/modules/newbb/viewtopic8781.htm?PHPSESSID=8...
【解决方案和步骤】
因为这个类是在JSP页面上调用的,那么,可以把这个类转移到项目的WEB-INF/src目录中,它会被编译、部署到WEB-INF/classes目录中,这样,就能调用同级的WebDriver类了。同时检查Server上ear/classes目录中已经部署过去的class文件有没有删除,不能只是在Studio中删除。
【备注】 |