一个Struts版本冲突导致的问题

前天,有个小应用,用Struts1.2.8作为系统框架,突然出现问题,启动时控制台上报错:

<2009-10-29 下午11时36分40秒 CST> <Error> <HTTP> <BEA-101216> <Servlet: "action" failed to preload on startup in Web application
"xmdswzgb".
javax.servlet.UnavailableException: org.apache.struts.util.MessageResourcesFactory.setConfig(Lorg/apache/struts/config/MessageRe
urcesConfig;)V
        at org.apache.struts.action.ActionServlet.init(ActionServlet.java:368)
        at javax.servlet.GenericServlet.init(GenericServlet.java:258)
        at weblogic.servlet.internal.ServletStubImpl$ServletInitAction.run(ServletStubImpl.java:993)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
        at weblogic.servlet.internal.ServletStubImpl.createServlet(ServletStubImpl.java:869)
        at weblogic.servlet.internal.ServletStubImpl.createInstances(ServletStubImpl.java:848)
        at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:787)
        at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:3252)
        at weblogic.servlet.internal.WebAppServletContext.preloadServlets(WebAppServletContext.java:3197)
        at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:3174)
        at weblogic.servlet.internal.HttpServer.preloadResources(HttpServer.java:688)
        at weblogic.servlet.internal.WebService.preloadResources(WebService.java:483)
        at weblogic.servlet.internal.ServletInitService.resume(ServletInitService.java:30)
        at weblogic.t3.srvr.SubsystemManager.resume(SubsystemManager.java:131)
        at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:964)
        at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:359)
        at weblogic.Server.main(Server.java:32)

 

 

粗一看,以就 中Struts启动初始化时装载配置文件出错,于是就按这个思路去找原因,翻来覆去就是找不出原因来,也拿Struts的源代码来单步跟踪,最后都是在:org.apache.struts.action.ActionServlet类中的方法initModuleMessageResources内出错,具体就是在执行:

factoryObject.setConfig(mrcs[i]);

这句时就出错了,查看factoryObject对象,没发现里面有定义setConfig方法。但我没意识到是这里出问题,于是继续找。找了两三天,还没有结果。

 

今天,想看看日志里会不会有什么线索。打开后发现日志里对这个错报出的信息与上面控制台显示的有所不同,如下:

2009-10-29 23:03:11 ERROR (ActionServlet.java:364) - Unable to initialize Struts ActionServlet due to an unexpected exception or error thrown, so marking the servlet as unavailable.  Most likely, this is due to an incorrect or missing library dependency.
java.lang.NoSuchMethodError: org.apache.struts.util.MessageResourcesFactory.setConfig(Lorg/apache/struts/config/MessageResourcesConfig;)V
 at org.apache.struts.action.ActionServlet.initModuleMessageResources(ActionServlet.java:918)
 at org.apache.struts.action.ActionServlet.init(ActionServlet.java:334)
 at javax.servlet.GenericServlet.init(GenericServlet.java:258)
 at weblogic.servlet.internal.ServletStubImpl$ServletInitAction.run(ServletStubImpl.java:993)
 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
 at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
 at weblogic.servlet.internal.ServletStubImpl.createServlet(ServletStubImpl.java:869)
 at weblogic.servlet.internal.ServletStubImpl.createInstances(ServletStubImpl.java:848)
 at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:787)
 at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:3252)
 at weblogic.servlet.internal.WebAppServletContext.preloadServlets(WebAppServletContext.java:3197)
 at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:3174)
 at weblogic.servlet.internal.HttpServer.preloadResources(HttpServer.java:688)
 at weblogic.servlet.internal.WebService.preloadResources(WebService.java:483)
 at weblogic.servlet.internal.ServletInitService.resume(ServletInitService.java:30)
 at weblogic.t3.srvr.SubsystemManager.resume(SubsystemManager.java:131)
 at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:964)
 at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:359)
 at weblogic.Server.main(Server.java:32)

 

看到红字那一句,原来是方法找不到,联想到刚才跟踪时factoryObject对象中没有setConfig方法,看来原因就是这个了。但我用的1.2.8版本的Struts,而从1.2.8的源代码可以看到是有这个方法的。怎么回事呢?我怀疑是不是应用中包含了两个不同版本的Struts。我于是就搜索应用的目录,没找到重复的Struts.jar。

 

于是手工在目录中进行搜寻,突然看到编译目标目录下有一个Struts1.2.7的目录,里面是完整的Struts1.2.7的包结构,于是就把目录从ClassPath中移除,再重启,OK。原来真是版本冲突带来的问题,这个1.2.7版的Struts是前两天为了调试一个问题而下载的,并把这些源文件也放到工程目录,开发工具自动编译了那些源文,才导致了前面出现的问题。于是把Struts1.2.7的类删除,再重启,就不再报错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值