Java 11环境下Struts2-core-2.3.37.jar路径非法字符异常求助
问题:Java 11 + Struts 2.3.37 在Windows环境下触发InvalidPathException
在Java 11环境中运行Struts 2已有6个多月,此前一切正常,但上周初突然抛出以下异常:
java.nio.file.InvalidPathException: Illegal char <:> at index 3: jar:file:\C:\Users\xxxuserxx\eclipse-workspace-migration.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ProEnergiaWeb\WEB-INF\lib\struts2-core-2.3.37.jar
开发环境为Windows + Eclipse,已知该版本Struts2-core.jar在Windows下存在路径处理问题,但此前一直正常运行。
已尝试以下操作但问题未解决:
- 新建工作区及Tomcat实例
- 调整Eclipse构建路径与Java编译器配置
- 更新项目Maven依赖
完整异常堆栈信息:
java.nio.file.InvalidPathException: Illegal char <:> at index 3: jar:file:\C:\Users\ricardodias\eclipse-workspace-migration-2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ProEnergiaWeb\WEB-INF\lib\struts2-core-2.3.37.jar at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182) at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153) at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77) at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92) at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229) at java.base/java.io.File.toPath(File.java:2290) at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1222) at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:726) at java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:843) at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:246) at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:176) at java.base/java.util.jar.JarFile.<init>(JarFile.java:346) at java.base/java.util.jar.JarFile.<init>(JarFile.java:317) at java.base/java.util.jar.JarFile.<init>(JarFile.java:256) at com.opensymphony.xwork2.util.fs.JarEntryRevision.needsReloading(JarEntryRevision.java:76) at com.opensymphony.xwork2.util.fs.DefaultFileManager.fileNeedsReloading(DefaultFileManager.java:66) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider.java:397) at org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:169) at com.opensymphony.xwork2.config.ConfigurationManager.needReloadContainerProviders(ConfigurationManager.java:215) at com.opensymphony.xwork2.config.ConfigurationManager.conditionalReload(ConfigurationManager.java:179) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:73) at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:978) at org.apache.struts2.dispatcher.ng.PrepareOperations.createActionContext(PrepareOperations.java:81) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:179) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:154) at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:179) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:154) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1786) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:834)
解决思路与建议
1. 升级Struts2版本
Struts 2.3.37属于老旧版本,官方后续修复了Java NIO路径处理的兼容性问题。建议升级到2.3.x系列的最新稳定版(如2.3.38),或直接迁移至更高版本的Struts2(如2.5.x或6.x),提前做好兼容性测试即可。
2. 修复JarEntryRevision类的路径处理逻辑
如果暂时无法升级版本,可以自定义JarEntryRevision类,替换原类中处理Jar路径的逻辑:
- 提取Jar路径时,先去掉
jar:file:\前缀,再转换为File对象 - 确保路径格式符合Windows系统要求,避免保留URL协议头导致的非法字符问题
3. 关闭Struts配置自动重载
在项目的struts.xml中添加以下配置,关闭配置文件自动重载功能,避免触发JarEntryRevision.needsReloading()方法的路径检查:
<constant name="struts.configuration.xml.reload" value="false"/>
4. 清理并重新部署项目
- 手动删除Tomcat临时目录(即异常路径中的
tmp0文件夹) - 清理Eclipse项目的
target目录,重新执行Maven构建 - 重新部署项目到Tomcat,确保部署路径无特殊字符
内容的提问来源于stack exchange,提问作者RicardoARDias
相关产品推荐
相关产品推荐

