关于“Could not open ServletContext resource [/WEB-INF/applicationContext.xml]”解决方案

问题产生



最近学了Maven,并尝试将以前的项目(springmvc+myabtis)重构成Maven项目,Maven项目推荐各种资源文件都放在src/Java/resources目录下,所以我自然把spring的配置文件(包括spring-mvc,spring-mybatis等配置都写在一个文件中)applicationContext.xml文件也放在了resources目录下,重构结束后,启动Tomcat报错:

[html]  view plain  copy
  1. 八月 31, 2015 3:26:24 下午 org.apache.catalina.core.AprLifecycleListener init  
  2. 信息: Loaded APR based Apache Tomcat Native library 1.1.22.  
  3. 八月 31, 2015 3:26:24 下午 org.apache.catalina.core.AprLifecycleListener init  
  4. 信息: APR capabilities: IPv6 [false], sendfile [true], accept filters [false], random [true].  
  5. 八月 31, 2015 3:26:25 下午 org.apache.coyote.AbstractProtocol init  
  6. 信息: Initializing ProtocolHandler ["http-apr-8080"]  
  7. 八月 31, 2015 3:26:25 下午 org.apache.coyote.AbstractProtocol init  
  8. 信息: Initializing ProtocolHandler ["ajp-apr-8009"]  
  9. 八月 31, 2015 3:26:25 下午 org.apache.catalina.startup.Catalina load  
  10. 信息: Initialization processed in 1784 ms  
  11. 八月 31, 2015 3:26:25 下午 org.apache.catalina.core.StandardService startInternal  
  12. 信息: Starting service Catalina  
  13. 八月 31, 2015 3:26:25 下午 org.apache.catalina.core.StandardEngine startInternal  
  14. 信息: Starting Servlet Engine: Apache Tomcat/7.0.26  
  15. 八月 31, 2015 3:26:25 下午 org.apache.catalina.startup.HostConfig deployDirectory  
  16. 信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\host-manager  
  17. 八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory  
  18. 信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\manager  
  19. 八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory  
  20. 信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\ROOT  
  21. 八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory  
  22. 信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\zhsz  
  23. 八月 31, 2015 3:26:26 下午 org.apache.catalina.loader.WebappClassLoader validateJarFile  
  24. 信息: validateJarFile(E:\java\apache-tomcat-7.0.26\webapps\zhsz\WEB-INF\lib\javaee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class  
  25. 八月 31, 2015 3:26:32 下午 org.apache.catalina.core.ApplicationContext log  
  26. 信息: No Spring WebApplicationInitializer types detected on classpath  
  27. log4j:ERROR Could not find value for key log4j.appender.stdout  
  28. log4j:ERROR Could not instantiate appender named "stdout".  
  29. log4j:ERROR Could not find value for key log4j.appender.debug  
  30. log4j:ERROR Could not instantiate appender named "debug".  
  31. 八月 31, 2015 3:26:32 下午 org.apache.catalina.core.ApplicationContext log  
  32. 信息: Initializing Spring root WebApplicationContext  
  33. 八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext listenerStart  
  34. 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener  
  35. org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]  
  36.     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)  
  37.     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)  
  38.     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)  
  39.     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)  
  40.     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)  
  41.     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)  
  42.     at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)  
  43.     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)  
  44.     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)  
  45.     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436)  
  46.     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)  
  47.     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)  
  48.     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)  
  49.     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)  
  50.     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)  
  51.     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)  
  52.     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)  
  53.     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)  
  54.     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)  
  55.     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)  
  56.     at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)  
  57.     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)  
  58.     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)  
  59.     at java.util.concurrent.FutureTask.run(FutureTask.java:166)  
  60.     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)  
  61.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)  
  62.     at java.lang.Thread.run(Thread.java:722)  
  63. Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]  
  64.     at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:140)  
  65.     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)  
  66.     ... 26 more  
  67. 八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext startInternal  
  68. 严重: Error listenerStart  
  69. 八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext startInternal  
  70. 严重: Context [/zhsz] startup failed due to previous errors  
  71. 八月 31, 2015 3:26:33 下午 org.apache.catalina.core.ApplicationContext log  
  72. 信息: Closing Spring root WebApplicationContext  
  73. 八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext listenerStop  
  74. 严重: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener  
  75. java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext  
  76.     at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172)  
  77.     at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1066)  
  78.     at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1040)  
  79.     at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988)  
  80.     at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556)  
  81.     at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)  
  82.     at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4819)  
  83.     at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5466)  
  84.     at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)  
  85.     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)  
  86.     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)  
  87.     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)  
  88.     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)  
  89.     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)  
  90.     at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)  
  91.     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)  
  92.     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)  
  93.     at java.util.concurrent.FutureTask.run(FutureTask.java:166)  
  94.     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)  
  95.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)  
  96.     at java.lang.Thread.run(Thread.java:722)  
  97. 八月 31, 2015 3:26:33 下午 org.apache.coyote.AbstractProtocol start  
  98. 信息: Starting ProtocolHandler ["http-apr-8080"]  
  99. 八月 31, 2015 3:26:33 下午 org.apache.coyote.AbstractProtocol start  
  100. 信息: Starting ProtocolHandler ["ajp-apr-8009"]  
  101. 八月 31, 2015 3:26:33 下午 org.apache.catalina.startup.Catalina start  
  102. 信息: Server startup in 7589 ms  

注意一下,其实重点就一句话,即Could not open ServletContext resource [/WEB-INF/applicationContext.xml],异常也很明显,FileNotException,无法打开ServletContext的资源文件。下面再看一下web.xml的配置:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  6.     id="WebApp_ID" version="3.0">  
  7.     <display-name>xxybm</display-name>  
  8.   
  9.     <listener>  
  10.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  11.     </listener>  
  12.   
  13.     <servlet>  
  14.         <servlet-name>springMvc</servlet-name>  
  15.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  16.         <init-param>  
  17.             <param-name>contextConfigLocation</param-name>  
  18.             <param-value>classpath:applicationContext.xml</param-value>  
  19.         </init-param>  
  20.         <load-on-startup>2</load-on-startup>  
  21.     </servlet>  
  22.   
  23.     <servlet-mapping>  
  24.         <servlet-name>springMvc</servlet-name>  
  25.         <url-pattern>/app/*</url-pattern>  
  26.     </servlet-mapping>  
  27.   
  28.   
  29.     <filter>  
  30.         <filter-name>SecurityFilter</filter-name>  
  31.         <filter-class>net.zhsz.util.LoginCheckFilter</filter-class>  
  32.     </filter>  
  33.     <filter-mapping>  
  34.         <filter-name>SecurityFilter</filter-name>  
  35.         <url-pattern>*.jsp</url-pattern>  
  36.     </filter-mapping>  
  37.     <filter-mapping>  
  38.         <filter-name>SecurityFilter</filter-name>  
  39.         <url-pattern>/app/*</url-pattern>  
  40.     </filter-mapping>  
  41.   
  42.   
  43.     <session-config>  
  44.         <session-timeout>30</session-timeout>  
  45.     </session-config>  
  46.   
  47.   
  48.     <error-page>  
  49.         <exception-type>java.lang.Exception</exception-type>  
  50.         <location>/500.html</location>  
  51.     </error-page>  
  52.   
  53. </web-app>  

由于在没用Maven之前,我的spring配置文件——applicationContext.xml是放在WEB-INF根目录下的,在项目运行时都是正常的,重构成Maven项目之后,我的配置文件自然应该放在src下的resources文件夹下了,那么在web.xml中我自然将<init-param>中contextConfigLocation的参数值由WEB-INF/applicationContext.xml修改为classpath:applicationContext.xml了,那么启动tomcat之后依然报错,而且我们从报错信息中可以看出容器依然是在WEB-INF下去找applicationContext.xml,很明显这个文件的位置已经被我们改变了,而且我们也修改了web.xml的配置为何还要从这里去加载呢?原因是我们缺少另一个重要的配置。



解决问题



遇到问题盲目搜索往往不能迅速得到有效的解决方案,所以我们先从官方去寻找线索,看一看spring的官方文档,在The Web的章节中可以发现这样一段话:


简单翻译一下上图标记的小段落:如果不特意指定参数名为contextConfigLoction的<context-parameter>元素,那么spring的ContextLoderListener监听器就会在/WEB-INF/下去寻找并加载该目录下的名为applicationContext.xml这个文件。So,我们应该在web.xml中添加<context-param>标签并再次指定spring核心文件的位置:

[html]  view plain  copy
  1. <context-param>  
  2.     <param-name>contextConfigLocation</param-name>  
  3.     <param-value>classpath:applicationContext.xml</param-value>  
  4. </context-param>  


这样就OK了,注意这段配置尽量写在靠前的位置,因为在tomcat启动后web项目会先初始化上下文,我们这段配置正是指定了上下文配置的文件位置,在上下文初始化完成之后才应当继续加载其余各种配置,而我们的springMVC的servlet仅仅是springMVC框架的相关配置,就好比struts2的配置一样,项目整体还是由spring去管理的。下面是修改之后的web.xml配置文件:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  6.     id="WebApp_ID" version="3.0">  
  7.     <display-name>xxybm</display-name>  
  8.       
  9.     <context-param>  
  10.         <param-name>contextConfigLocation</param-name>  
  11.         <param-value>classpath:applicationContext.xml</param-value>  
  12.     </context-param>  
  13.   
  14.     <listener>  
  15.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  16.     </listener>  
  17.   
  18.     <servlet>  
  19.         <servlet-name>springMvc</servlet-name>  
  20.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  21.         <init-param>  
  22.             <param-name>contextConfigLocation</param-name>  
  23.             <param-value>classpath:applicationContext.xml</param-value>  
  24.         </init-param>  
  25.         <load-on-startup>2</load-on-startup>  
  26.     </servlet>  
  27.   
  28.     <servlet-mapping>  
  29.         <servlet-name>springMvc</servlet-name>  
  30.         <url-pattern>/app/*</url-pattern>  
  31.     </servlet-mapping>  
  32.   
  33.     <filter>  
  34.         <filter-name>SecurityFilter</filter-name>  
  35.         <filter-class>net.zhsz.util.LoginCheckFilter</filter-class>  
  36.     </filter>  
  37.       
  38.     <filter-mapping>  
  39.         <filter-name>SecurityFilter</filter-name>  
  40.         <url-pattern>*.jsp</url-pattern>  
  41.     </filter-mapping>  
  42.       
  43.     <filter-mapping>  
  44.         <filter-name>SecurityFilter</filter-name>  
  45.         <url-pattern>/app/*</url-pattern>  
  46.     </filter-mapping>  
  47.   
  48.     <session-config>  
  49.         <session-timeout>30</session-timeout>  
  50.     </session-config>  
  51.   
  52.     <error-page>  
  53.         <exception-type>java.lang.Exception</exception-type>  
  54.         <location>/500.html</location>  
  55.     </error-page>  
  56. </web-app>  

最后再次启动项目,运行正常,spring和springMVC均正常加载并初始化。之前在网上查的有人说修改路径,加星号,又是少jar包,答案千奇百怪,然后都无法解决问题,总之这篇blog希望能对遇到这个异常的朋友有所帮助,The End。

原文地址:http://blog.csdn.net/wlwlwlwl015/article/details/48134763

猜你喜欢

转载自blog.csdn.net/bobzhangfighting/article/details/75212728