问题场景:
同事报告,把以前运行java项目部署到新系统中,没有任何错误提示,但访问错误。
询问系统环境:DELL 64位的PC服务器 + Jrockit-R27.5.0-jdk1.6.0_03 + Apache-tomcat-6.0.16
错误表现:
。根据IE访问的页面错误,可以断定是Spring没有向提供服务的Servlet中注入指定的类。
。查看tomcat启动信息,没有报错,也没有Spring的启动类注入过程
。同样的代码在另一台机器上的 tomcat5.5上运行无误。
诊断:
。64位应该是向下兼容的,应该不是这个问题
。如果在tomcat5.5上正常,那估计应该是 tomcat 升级后带来的问题
问题解决:
。在网上查资料,看新版本的spring中,web.xml文件的配置和原来有不同的地方之前加载spring的多个配置文件我一直用的如下方式:
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/Tree.xml
- /WEB-INF/Reader.xml
- /WEB-INF/Servlet.xml
- </param-value>
- </context-param>
- <servlet>
- <servlet-name>context</servlet-name>
- <servlet-class>
- org.springframework.web.context.ContextLoaderServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
新下的Spring的例子中,都使用如下的 ContextLoaderListener 方式加载
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/Tree.xml
- /WEB-INF/Reader.xml
- /WEB-INF/Servlet.xml
- </param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
于是修改了web.xml中的配置,使用 ContextLoaderListener 方式加载spring的配置xml
启动tomcat6,和之前比,有一点变化,启动信息报错监听器启动错误
- 2008-11-5 18:30:58 org.apache.catalina.core.StandardContext start
- 严重: Error listenerStart
究竟哪儿错了,不得而知。到网上搜索 Error listenerStart 关键词,发现很多人遇到这个问题,但绝大多数是hibernate的版本导致,或是其它jar包冲突造成。但我的工程里面都没有使用到这些内容。找不到原因,只有查tomcat6日志,想知道为什么ListenerStart 错误,但控制台输出信息极少。到tomcat6的 logs 目录下,发现 localhost.2008-11-05.log 文件体积变大,打开查看到如下信息
- java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
- at org.springframework.web.context.ContextLoader.<init>(ContextLoader.java:139)
- at org.springframework.web.context.ContextLoaderServlet.createContextLoader(ContextLoaderServlet.java:91)
- at org.springframework.web.context.ContextLoaderServlet.init(ContextLoaderServlet.java:82)
- at javax.servlet.GenericServlet.init(GenericServlet.java:212)
- at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1172)
原来是tomcat6启动spring的时候,需要apache 的 logging 包,结果没找到。立即拷贝 commons-logging.jar 在到 项目的 WEB-INF/lib/ 目录下,重启系统正常运行!
总结:
。使用tomcat5.5的时候没有出现该问题,搜索了tomcat5.5的lib目录,也没找到 commons-logging.jar 的包。 难道spring在两个版本的 tomcat 启动过程不一样,我也没去跟踪。
。tomcat6的控制台只显示了部分信息,要了解其它更多细节,需要查看 localhost 的 log 文件。我以前使用localhost文件主要是查看用户的链接访问信息,没觉得有太多程序运行的细节信息。不知道是tomcat改了,还是我自己以前没注意!!