关于“Could not open ServletContext resource [/WEB-INF/applicationContext.xml]”解决方案-程序员宅基地

技术标签: spring启动报错  Could not open..  Spring  



问题产生



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

八月 31, 2015 3:26:24 下午 org.apache.catalina.core.AprLifecycleListener init
信息: Loaded APR based Apache Tomcat Native library 1.1.22.
八月 31, 2015 3:26:24 下午 org.apache.catalina.core.AprLifecycleListener init
信息: APR capabilities: IPv6 [false], sendfile [true], accept filters [false], random [true].
八月 31, 2015 3:26:25 下午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-apr-8080"]
八月 31, 2015 3:26:25 下午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["ajp-apr-8009"]
八月 31, 2015 3:26:25 下午 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 1784 ms
八月 31, 2015 3:26:25 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service Catalina
八月 31, 2015 3:26:25 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.26
八月 31, 2015 3:26:25 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\host-manager
八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\manager
八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\ROOT
八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\zhsz
八月 31, 2015 3:26:26 下午 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: 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
八月 31, 2015 3:26:32 下午 org.apache.catalina.core.ApplicationContext log
信息: No Spring WebApplicationInitializer types detected on classpath
log4j:ERROR Could not find value for key log4j.appender.stdout
log4j:ERROR Could not instantiate appender named "stdout".
log4j:ERROR Could not find value for key log4j.appender.debug
log4j:ERROR Could not instantiate appender named "debug".
八月 31, 2015 3:26:32 下午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
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]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
	at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
	at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
	at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:140)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
	... 26 more
八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext startInternal
严重: Error listenerStart
八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext startInternal
严重: Context [/zhsz] startup failed due to previous errors
八月 31, 2015 3:26:33 下午 org.apache.catalina.core.ApplicationContext log
信息: Closing Spring root WebApplicationContext
八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext listenerStop
严重: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
	at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172)
	at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1066)
	at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1040)
	at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988)
	at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556)
	at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4819)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5466)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
八月 31, 2015 3:26:33 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-apr-8080"]
八月 31, 2015 3:26:33 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-apr-8009"]
八月 31, 2015 3:26:33 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 7589 ms

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>xxybm</display-name>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>springMvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:applicationContext.xml</param-value>
		</init-param>
		<load-on-startup>2</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springMvc</servlet-name>
		<url-pattern>/app/*</url-pattern>
	</servlet-mapping>


	<filter>
		<filter-name>SecurityFilter</filter-name>
		<filter-class>net.zhsz.util.LoginCheckFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>SecurityFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>SecurityFilter</filter-name>
		<url-pattern>/app/*</url-pattern>
	</filter-mapping>


	<session-config>
		<session-timeout>30</session-timeout>
	</session-config>


	<error-page>
		<exception-type>java.lang.Exception</exception-type>
		<location>/500.html</location>
	</error-page>

</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核心文件的位置:

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>


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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>xxybm</display-name>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>springMvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:applicationContext.xml</param-value>
		</init-param>
		<load-on-startup>2</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springMvc</servlet-name>
		<url-pattern>/app/*</url-pattern>
	</servlet-mapping>

	<filter>
		<filter-name>SecurityFilter</filter-name>
		<filter-class>net.zhsz.util.LoginCheckFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>SecurityFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	
	<filter-mapping>
		<filter-name>SecurityFilter</filter-name>
		<url-pattern>/app/*</url-pattern>
	</filter-mapping>

	<session-config>
		<session-timeout>30</session-timeout>
	</session-config>

	<error-page>
		<exception-type>java.lang.Exception</exception-type>
		<location>/500.html</location>
	</error-page>
</web-app>

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wlwlwlwl015/article/details/48134763

智能推荐

Basys3 FPGA 3-8译码器开发及应用_使用vivado设计3线—8线译码器,并在basys 3开发板上实现其功能。 1. 实验程序记录-程序员宅基地

文章浏览阅读2.9k次。实验3 3-8译码器开发及应用实验目的:1 学习 Verilog HDL 基本语法2 巩固 Vivado 2014.2 环境下的 Verilog HDL 编程设计的基础。实验设备: XILINX BASYS3实验步骤:1 打开vivado。2 点create new project 进入新建工程向导3 输入project名称,并选择存储地址,注意_使用vivado设计3线—8线译码器,并在basys 3开发板上实现其功能。 1. 实验程序记录

POJ 3974 Palindrome(Manacher)_palindrome manacher-程序员宅基地

文章浏览阅读560次。PalindromeDescriptionAndy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "Can you propose an efficient algori_palindrome manacher

安装eclipse时 提示The Eclipse executable launcher was unable to locate its companion (可执行程序无法找到其同伴共享库)-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏25次。操作系统:win7The Eclipse executable launcher was unableto locate its companion shared library译:Eclipse出现可执行程序无法找到其同伴共享库一、打开eclipse目录下的配置文件eclipse.ini。 二、将--launcher.library和-startup下面的路径都改为当前的正确..._the eclipse executable launcher was unable to locate its companion shared li

手机开热点,电脑连,关于两个局域网的问题_电脑和手机不在一个局域网-程序员宅基地

文章浏览阅读1.9w次。针对情况:手机开的4g,开wifi,电脑连手机的热点 原理:电脑会有一个局域网的ip 1.在运行中输入cmd,在dos窗口下输入ipconfig,找到这一行2.测试 : 手机的浏览器上,输入172.20.10.5加上一个端口号去访问你电脑上开启的应用,就可以了。。。(这是手机的浏览器访问电脑的应用,我这里是xBuilder)..._电脑和手机不在一个局域网

VIJOS-P1144 小胖守皇宫(树形dp)_csdn 小胖守皇宫-程序员宅基地

文章浏览阅读1k次。对于每一个节点,有3种状态:自己守自己,被儿子守,被父亲守;每次用儿子更新父节点。设f [st][0]表示被自己守,它的儿子三种状态都可以;f[st][2]表示被父亲守,那么这个节点不能守它的儿子,它的儿子有两种状态:被自己守,被儿子守;f[st][1]表示被儿子守。当儿子的最优状态为自己守自己,这就非常和谐。但儿子的最优状态可能是被它的儿子守啊,这时要加上f[to][0] - f[t_csdn 小胖守皇宫

九度考研真题 浙大 2005-3浙大1012:畅通工程-程序员宅基地

文章浏览阅读323次。//题目1012:畅通工程#include#includeusing namespace std;int Tree[1020];int findRoot(int x){if(Tree[x]==-1) return x;else {int tmp=findRoot(Tree[x]);Tree[x]=tmp;return tmp;} }int

随便推点

IT人事面试及应对_it面试也是应试-程序员宅基地

文章浏览阅读4.4k次,点赞4次,收藏34次。1、请你自我介绍一下你自己?回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有。其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出积极的个性和做事的能力,说得合情合理企业才会相信。企业很重视一个人的礼貌,求职者要尊重考官,在回..._it面试也是应试

怎样恢复计算机程序打开文件名,Word提示如何解决使用文本恢复转换器打开文件的问题...-程序员宅基地

文章浏览阅读855次。使用“文本恢复转换器2113”首先打开单词5261(找到任何未损坏的word文档以打开),然后在4102中单击“工具”→“选项1653”→在“常规”选项卡中,找到“打开时确认转换”并选择它,然后单击“确定”退出,然后单击“文件”-“打开”,找到您需要修复的文件,单击选择(请不要双击直接打开它),在右下角有一个“打开”按钮是否找到了黑色的小三角形?在下图中红点的位置。单击它,然后选择“打开并修复”选..._怎么还原文件用计算机程序名称

分享安卓手机里的钢琴键盘模拟器给大家_钢琴键盘模拟器安卓-程序员宅基地

文章浏览阅读1.8k次。安卓手机里的钢琴键盘模拟器,对于我们模拟练习钢琴非常有用。我们先打开手机,然后启动手机桌面上的【钢琴键盘模拟器】今天就和大家分享一下。点 击【钢琴键盘模拟器】的图标,进入可操作界面。这时候会制动跳转到手机横屏界面。我们可以看到在操作界面里有模拟钢琴的黑白键盘。同时在钢琴键盘模拟器的操作界面里,我们点击“加号”“减号”按钮可以调节黑白键盘的大小比例。  可以选择在钢琴键盘模拟器的操作界面里自己录..._钢琴键盘模拟器安卓

英文视频字幕自动生成_生成英文字幕-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏25次。笔者正在制作少儿编程教育系列视频,发现有大量的英文视频资料值得学习,但是视频中缺少字幕,可能会对学生的学习过程带来困扰。如果能够得到英文字幕,再通过谷歌翻译等工具的使用,就可以进一步生成中文字幕。因此,开始探索快速生成字幕的方法,本文对实现过程进行记录,笔者的计算机使用的是Windows 10 64位操作系统。注:需要计算机通过某些方法成功访问谷歌!整体流程可划分为:安装Python2下..._生成英文字幕

springboot 与swagger整合出现Unable to infer base url.This is common when using dynamic的解决办法_springboot 集成swagger unable to infer base url. thi-程序员宅基地

文章浏览阅读8.2k次,点赞2次,收藏2次。今天在springboot与swagger整合测试的时候跳出如下所示界面经查资料发现有两种解决办法,1.直接把@EnableSwagger2注解加在主启动类就可以,这样虽然能解决问题,但是这样会扫到使用的框架的接口,这种方法要慎用。2.主启动类加上@ComponentScan("swagger配置类所在包"),以保证配置类被扫描到最后解决问题之后就可以访问 你的配置文..._springboot 集成swagger unable to infer base url. this is common when using d

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory-程序员宅基地

文章浏览阅读3.7k次。Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactoryException in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory at org.a..._java.lang.noclassdeffounderror: org/apache/poi/util/poilogfactory

推荐文章

热门文章

相关标签