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

系统管理员 2022-08-04 13:54 212阅读 0赞

问题产生

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

  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的配置:

  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. <listener>
  9. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  10. </listener>
  11. <servlet>
  12. <servlet-name>springMvc</servlet-name>
  13. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  14. <init-param>
  15. <param-name>contextConfigLocation</param-name>
  16. <param-value>classpath:applicationContext.xml</param-value>
  17. </init-param>
  18. <load-on-startup>2</load-on-startup>
  19. </servlet>
  20. <servlet-mapping>
  21. <servlet-name>springMvc</servlet-name>
  22. <url-pattern>/app/*</url-pattern>
  23. </servlet-mapping>
  24. <filter>
  25. <filter-name>SecurityFilter</filter-name>
  26. <filter-class>net.zhsz.util.LoginCheckFilter</filter-class>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>SecurityFilter</filter-name>
  30. <url-pattern>*.jsp</url-pattern>
  31. </filter-mapping>
  32. <filter-mapping>
  33. <filter-name>SecurityFilter</filter-name>
  34. <url-pattern>/app/*</url-pattern>
  35. </filter-mapping>
  36. <session-config>
  37. <session-timeout>30</session-timeout>
  38. </session-config>
  39. <error-page>
  40. <exception-type>java.lang.Exception</exception-type>
  41. <location>/500.html</location>
  42. </error-page>
  43. </web-app>

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

解决问题

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

Center

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

  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配置文件:

  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. <context-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:applicationContext.xml</param-value>
  11. </context-param>
  12. <listener>
  13. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  14. </listener>
  15. <servlet>
  16. <servlet-name>springMvc</servlet-name>
  17. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  18. <init-param>
  19. <param-name>contextConfigLocation</param-name>
  20. <param-value>classpath:applicationContext.xml</param-value>
  21. </init-param>
  22. <load-on-startup>2</load-on-startup>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>springMvc</servlet-name>
  26. <url-pattern>/app/*</url-pattern>
  27. </servlet-mapping>
  28. <filter>
  29. <filter-name>SecurityFilter</filter-name>
  30. <filter-class>net.zhsz.util.LoginCheckFilter</filter-class>
  31. </filter>
  32. <filter-mapping>
  33. <filter-name>SecurityFilter</filter-name>
  34. <url-pattern>*.jsp</url-pattern>
  35. </filter-mapping>
  36. <filter-mapping>
  37. <filter-name>SecurityFilter</filter-name>
  38. <url-pattern>/app/*</url-pattern>
  39. </filter-mapping>
  40. <session-config>
  41. <session-timeout>30</session-timeout>
  42. </session-config>
  43. <error-page>
  44. <exception-type>java.lang.Exception</exception-type>
  45. <location>/500.html</location>
  46. </error-page>
  47. </web-app>

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

发表评论

表情:
评论列表 (有 0 条评论,212人围观)

还没有评论,来说两句吧...

相关阅读