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配置真的不懂。水文獻醜了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章