我有一个在Tomcat 9上运行的Java-web应用程序。它在Windowns机器上运行良好。但是在Debian Linux服务器上部署这个应用程序后,我在某些特定页面上遇到了java.lang.StackOverflow异常。这是stacktrace日志的开头:
27-Dec-2017 08:54:43.746 SEVERE [https-jsse-nio-9443-exec-3]
org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for
servlet [jsp] threw exception
java.lang.StackOverflowError
at java.io.UnixFileSystem.canonicalize0(Native Method)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:172)
at java.io.File.getCanonicalPath(File.java:618)
at org.apache.catalina.webresources.AbstractFileResourceSet.file(AbstractFileResourceSet.java:90)
请在此处查看完整的堆栈跟踪: https://pastebin.com/0AmFDY8F
据我所知,在Jasper编译JSP页面源时出现异常,并且它与Linux路径/目录的解析有某种关系。有人可以帮我弄清楚究竟是什么问题吗?如果问题可能与此有关,我没有创建任何符号链接。
答案 0 :(得分:0)
根据您的堆栈跟踪,问题是由于无法找到Spring框架解析的特定路径引起的:
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
...
引起:java.io.IOException:JSPException包括路径'/struct/context/tutorials.jsp'。
Spring框架很可能使用规范路径来解析文件,并且它可能会失败,因为框架中存在与您正在部署的Unix系统类型相关的一些怪癖。
请在Spring文档中引用它:
默认脚本支持大多数Linux发行版,并在CentOS和Ubuntu上进行测试。其他平台,如OS X和FreeBSD,将需要使用自定义embeddedLaunchScript。
请注意,Debian未列出。希望这会让你走上正确的道路 如果我在这里追逐一只红鲱鱼,我很抱歉 - 但你没有给我们太多的帮助。
答案 1 :(得分:0)
最后我发现导致StackOverflow异常的原因。我有一个递归的JSP标记调用来呈现<select>
标记的嵌套选项。删除递归后,异常消失了。当然,这只是一种解决方法,所以我仍然想知道为什么它在Windows上运行良好而在Linux上运行不正常。