Spring MVC 源码下用Tomcat8.5以上版本启动一直报java.nio.file.AccessDeniedException

11-Apr-2020 22:22:20.069 严重 [http-nio-8080-exec-4] org.springframework.web.servlet.FrameworkServlet.initServletBean Context initialization failed
	org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [D:\Program Files\apache-tomcat-8.5.54\webapps\ROOT\WEB-INF\classes\com]; nested exception is java.nio.file.AccessDeniedException: D:\Program Files\apache-tomcat-8.5.54\webapps\ROOT\WEB-INF\classes\com
		at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:345)
		at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:305)
		at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
		at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224)
		at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195)
		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:133)
		at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:749)
		at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584)
		at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702)
		at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:668)
		at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:716)
		at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:591)
		at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530)
		at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170)
		at javax.servlet.GenericServlet.init(GenericServlet.java:158)
		at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
		at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
		at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:763)
		at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
		at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
		at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
		at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
		at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
		at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
		at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
		at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
		at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1627)
		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
		at java.lang.Thread.run(Thread.java:748)
	Caused by: java.nio.file.AccessDeniedException: D:\Program Files\apache-tomcat-8.5.54\webapps\ROOT\WEB-INF\classes\com
		at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)
		at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
		at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
		at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)
		at java.nio.file.Files.newByteChannel(Files.java:361)
		at java.nio.file.Files.newByteChannel(Files.java:407)
		at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
		at java.nio.file.Files.newInputStream(Files.java:152)
		at org.springframework.core.io.FileSystemResource.getInputStream(FileSystemResource.java:186)
		at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:331)
		... 36 more

最近研究Spring的源码,就在Spring 项目中写了一个模块,demo调试用,一直报这个错误,不知道怎么解决?
求助大佬们。
本人经验:

  1. 有人说9.0版本太高了,降版本,我降到8.5一样的错误。
  2. 有人说由于windows登录的账号不是管理员账号,所以需要对tomcat文件夹赋权,参考文章转载Angel挤一挤,我改了,但是没有重启系统一样没有用,重启也没用。
  3. 有其他进程占用了这个文件,参考文章如何解决java - 进程无法访问该文件,因为它正由另一个进程使用,但是我重启系统也没用。肯定不是这个原因了,还有网上很多都是删除的时候出现,我这是只读。
  4. 有人说这个文件不存在,然后我去看了一下,这个文件夹存在啊。
  5. 从4中我有了一个思路了,是不是我配置错了啊。去看了一下spring-mvc的配置,发现可能配置错了。并且我直接tomcat启动发现报了不一样的错。

tomcat直接启动报错如下:

12-Apr-2020 09:17:41.186 涓ラ噸 [http-nio-8080-exec-1] org.springframework.web.servlet.FrameworkServlet.initServletBean Context initialization failed
        org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [C:\apache-tomcat-8.5.54\webapps\ROOT\WEB-INF\classes\com]; nested exception is java.nio.file.AccessDeniedException: C:\apache-tomcat-8.5.54\webapps\ROOT\WEB-INF\classes\com
                at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:345)
                at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:305)
                at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
                at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224)
                at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195)
                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:133)
                at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:749)
                at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584)
                at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702)
                at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:668)
                at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:716)
                at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:591)
                at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530)
                at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170)
                at javax.servlet.GenericServlet.init(GenericServlet.java:158)
                at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
                at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
                at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:763)
                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
                at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1627)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.lang.Thread.run(Unknown Source)
        Caused by: java.nio.file.AccessDeniedException: C:\apache-tomcat-8.5.54\webapps\ROOT\WEB-INF\classes\com
                at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
                at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
                at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
                at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(Unknown Source)
                at java.nio.file.Files.newByteChannel(Unknown Source)
                at java.nio.file.Files.newByteChannel(Unknown Source)
                at java.nio.file.spi.FileSystemProvider.newInputStream(Unknown Source)
                at java.nio.file.Files.newInputStream(Unknown Source)
                at org.springframework.core.io.FileSystemResource.getInputStream(FileSystemResource.java:186)
                at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:331)
                ... 36 more

下面报了未知资源的错误。这时我想了一下,真可能配置错了。

解决

我之前的SpringMvc的web.xml配置如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <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:*</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

看到了配置文件路径那里,配置成classpath:*了,难道是这个原因?仔细想了一下有可能,这里本来是要配置文件的,但是我配置*可能会出问题。
于是我改成如下配置:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <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:springMvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

启动访问一下,没问题了

总结

配置文件路径,千万不能配置成文件夹或者*,必须配置成文件。还有本人之前一直使用SpringBoot开发,对这种xml配置真的不懂。水文献丑了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发哥随手记

你的鼓励将是我创作的最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值