我正在使用来自我的前端依赖项的WebJars并从Jetty 9.3.2提供它们。 Spring MVC用于映射资源。
问题通常在代码部署后一天左右浮出水面。资源文件将返回404或500堆栈,如:
java.io.FileNotFoundException: ServletContext resource [/webjars/angular-ui-select/0.13.1/select.js] cannot be resolved to URL because it does not exist
at org.springframework.web.context.support.ServletContextResource.getURL(ServletContextResource.java:156)
at org.springframework.core.io.AbstractFileResolvingResource.lastModified(AbstractFileResolvingResource.java:166)
at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:240)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860)
...
根据源和内存转储,如果org.eclipse.jetty.webapp.WebAppContext.Context.getResource(String)
为先前找到的资源返回null,则抛出此异常。
我非常怀疑这是jetty中的一个错误,因为它无法提供服务的文件也会随着时间而变化。
我已查看更改日志,但无法查看相关信息。
有没有人见过这样的东西?
编辑:
我跟踪堆转储的可能代码路径,似乎唯一可能的原因是JarFileResource.exists()
错误地返回false。但是,除了该方法存在潜在的线程安全问题之外,我也无法找到任何问题。该方法的Btrace显示它在所有情况下都正确返回,即使在跟踪期间抛出了上述异常。
JarURLConnection
缓存功能存在潜在问题。但是,我从未见过任何"文件关闭异常"这表明这个错误。 (JarFileResource
类层次结构是btrace&d;并且所有捕获的异常都是由Jetty搜索每个JAR中的资源引起的预期FileNotFoundException
。)