Windows下Java调用getLastModifiedTime报错的原因排查求助
问题描述
应用部署在Windows Server系统的WildFly 18与JDK 11环境中,日志频繁出现如下报错堆栈:
2022-10-14 14:36:19,382 ERROR [io.undertow.request] (default I/O-2) UT005071: Undertow request failed HttpServerExchange{ GET /application/images/gray/qtip/nul}: java.lang.RuntimeException: java.nio.file.FileSystemException: C:\PROGRAM\SAUSAGE\wildfly-gui\standalone\tmp\vfs\temp\temp5bd4c0db725d6b53\content-d8575e88ce594507\images\gray\qtip\nul: The parameter is incorrect. at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.PathResource.getLastModified(PathResource.java:65) at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.deployment.ServletResource.getLastModified(ServletResource.java:61) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.CachedResource.<init>(CachedResource.java:59) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.CachingResourceManager.getResource(CachingResourceManager.java:119) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.CachingResourceManager.getResource(CachingResourceManager.java:32) at io.undertow.servlet@2.0.27.Final//io.undertow.servlet.handlers.ServletPathMatches.getServletHandlerByPath(ServletPathMatches.java:96) at io.undertow.servlet@2.0.27.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:146) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PathHandler.handleRequest(PathHandler.java:91) at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Host$OptionsHandler.handleRequest(Host.java:399) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.SetHeaderHandler.handleRequest(SetHeaderHandler.java:90) at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Host$AcmeResourceHandler.handleRequest(Host.java:421) at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Host$HostRootHandler.handleRequest(Host.java:430) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.NameVirtualHostHandler.handleRequest(NameVirtualHostHandler.java:64) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.error.SimpleErrorPageHandler.handleRequest(SimpleErrorPageHandler.java:78) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.CanonicalPathHandler.handleRequest(CanonicalPathHandler.java:49) at org.wildfly.extension.undertow@18.0.1.Final//org.wildfly.extension.undertow.Server$DefaultHostHandler.handleRequest(Server.java:190) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.ChannelUpgradeHandler.handleRequest(ChannelUpgradeHandler.java:211) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.DisallowedMethodsHandler.handleRequest(DisallowedMethodsHandler.java:61) at io.undertow.core@2.0.27.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:376) at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:255) at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:59) at org.jboss.xnio@3.7.3.Final//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92) at org.jboss.xnio@3.7.3.Final//org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66) at io.undertow.core@2.0.27.Final//io.undertow.protocols.ssl.SslConduit$SslReadReadyHandler.readReady(SslConduit.java:1176) at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89) at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.WorkerThread.run(WorkerThread.java:591) Caused by: java.nio.file.FileSystemException: C:\PROGRAM\SAUSAGE\wildfly-gui\standalone\tmp\vfs\temp\temp5bd4c0db725d6b53\content-d8575e88ce594507\images\gray\qtip\nul: The parameter is incorrect. at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108) at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:53) at java.base/sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:38) at java.base/sun.nio.fs.WindowsFileSystemProvider.readAttributes(WindowsFileSystemProvider.java:198) at java.base/java.nio.file.Files.readAttributes(Files.java:1764) at java.base/java.nio.file.Files.getLastModifiedTime(Files.java:2315) at io.undertow.core@2.0.27.Final//io.undertow.server.handlers.resource.PathResource.getLastModified(PathResource.java:63) ... 36 more
报错始终由getLastModifiedTime方法触发,怀疑是Java程序权限不足,但无法确定具体原因,需要协助排查。
问题分析与解决建议
- 核心原因定位:报错路径中的
nul是Windows系统的保留设备名,Windows不允许创建或访问名为nul的文件/目录,哪怕它是路径的一部分。当Undertow尝试调用getLastModifiedTime访问这个路径时,Windows内核直接返回"参数不正确"的错误,和权限无关。 - 排查方向:
- 检查应用代码或前端资源引用:确认是否存在指向
/application/images/gray/qtip/nul的错误请求,可能是前端页面的错误资源路径、爬虫的无效请求,或者代码中生成了错误的资源路径。 - 检查WildFly的VFS缓存:WildFly的VFS(虚拟文件系统)会临时解压部署包内容,确认部署包中是否误包含了名为
nul的文件/目录,若有则删除后重新部署。
- 检查应用代码或前端资源引用:确认是否存在指向
- 临时缓解方案:
- 在Undertow配置中添加路径拦截规则,拦截所有指向
nul的请求,避免Undertow尝试访问无效路径。 - 清理WildFly的临时目录:停止服务后删除
C:\PROGRAM\SAUSAGE\wildfly-gui\standalone\tmp\vfs下的临时文件,重启服务后重新生成缓存。
- 在Undertow配置中添加路径拦截规则,拦截所有指向
内容的提问来源于stack exchange,提问作者ksclfanatic
相关产品推荐
相关产品推荐

