You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:30:35