_jspService 超出了 65535 字节的限制
Posted
技术标签:
【中文标题】_jspService 超出了 65535 字节的限制【英文标题】:_jspService is exceeding the 65535 bytes limit 【发布时间】:2011-07-25 22:48:18 【问题描述】:所以我正在处理在 Websphere 7 (JDK 6) 上运行的遗留 servlet 代码。开发环境设置使用 Tomcat 6 (JDK 6)。
-
为什么它可以在 Websphere 7 和
不在 Tomcat 6 中?
这是否与
应用服务器?
如果你的答案是肯定的,否定的。 2,除了分解代码或使用动态包含之外,您在 Tomcat 6 (JDK 6) 上是否有解决此问题的方法?
计划不同意将静态包含更改为动态包含,主要是因为大多数页面都与业务模型代码(包括应用程序的主模板)耦合。
【问题讨论】:
现在下载 WAS 6 express。 也许下一个问题是,是否可以改变JVM的方法大小限制? 我会将(大)部分重构为(包含)标签。 (有缺陷的)商业模式是没有争议的。 “下一个问题”的答案是。不,简单明了。限制在类文件 format ...而不是 JVM 中。 另见***.com/questions/7495985/… 【参考方案1】:听起来您遇到了64k method limit,这可能是由于Tomcat 如何从您的JSP 中构建一个类。 This page 建议像这样更改静态包括:
<%@ include file="test.jsp" %>
像这样动态包含以避免该问题:
<jsp:include page="test.jsp" />
【讨论】:
是的,我知道这一点,我已经改写了我的最后一个问题,这就是我的意思 - 动态包括 啊。我怀疑你对 Tomcat 有很多选择,除非你想破解它来分解长方法以避免限制。无法保证 Web 容器如何将您的 JSP 分解为 Java 以编译成一个类。您需要找到一个与 Tomcat 不同的容器,或许可以尝试 Jetty 或 Resin? 对我来说也一样。谢谢! 不错,但如果我确实包含 jsp:include 那么为什么它可以在 Websphere 7 上运行,而不是在 Tomcat 6 上运行
因为它们有不同的 JSP 编译器,可以将 JSP 转换为不同的 Java 代码。 Tomcat JSP 编译器 (Jasper) 显然无法处理大型 JSP。
也许下一个问题是,是否可以改变JVM的方法大小限制?
没有。这些限制是硬连线到类文件的格式/结构中。
详细信息在JVM spec ... 但它相当复杂,从你的问题中并不能完全清楚你达到了哪个限制。 (但这无关紧要……它们无法更改。)
【讨论】:
其实没那么简单。 method_count 字段限制每个类的方法数量,而不是每个方法的代码长度。 Code_attribute 结构中的相关字段 code_length 是一个 32 位无符号整数,但由于其他属性是使用 16 位无符号整数索引代码,因此在类文件格式规范中另外声明“code_length 项的值必须小于 65536"。在某些情况下,它甚至必须小于 65535,因为索引 65535 上的指令不能被异常处理程序保护。 命中错误与jsp代码变成的方法名称“_jspService”有关。编译器不够聪明,无法将长代码拆分为多个(链接的)“_jspServiceXXX”方法。方法的字节码不能超过 65535 字节。其他一些工具也无法生成正确的代码。 'asm 例如在生成大类的“字节码”时失败,错误是一样的。【参考方案3】:有时将您的 JSP 分解为包含没有意义或不起作用。在编译时强制将 JSP 分解为单独方法的另一种方法是使用 <c:catch>
将 JSP 分成段。
【讨论】:
您介意详细说明如何通过使用我的静态 html/jss/css 块用完了,我可以将其外部化到 jsp:include
(大部分非静态 html 被留下)...
你可以把你的web.xml
,mappedfile 设置为 false 像这样去掉许多静态行,这些静态行不一定是放入包含的好块,但它们加起来可以节省空间:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
...
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
...
</servlet>
Peter Hart 的 <c:catch>
解决方案听起来也是不错的选择。
【讨论】:
谢谢,这个解决方案帮了我很多,节省了我的时间。【参考方案5】:通过将初始化参数“mappedFile”设置为“false”对我有用。
但使用 eclipse 插件有时会被删除,需要在 tomcat home 中重新设置。
【讨论】:
【参考方案6】:对于standalone.xml 中的JBoss eap 6,在web 子系统下添加以下代码。
<configuration>
<jsp-configuration development="true" mapped-file="false"/>
</configuration>
它解决了我的问题。
【讨论】:
【参考方案7】:最好直接指出更改它的位置,如以下链接所述: https://www.assetbank.co.uk/support/documentation/knowledge-base/byte-limit-exceeded-error/
找到文件 [Tomcat_Home]/conf/web.xml 并在文件中搜索“JspServlet”。这应该返回一个包含一些<init-param>
值的<servlet>
的xml 节点。您需要添加一个额外的<init-param>
,如下所示。
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
这对tomcat用户来说更清晰直接
当然,其他参考解决方案,主要在之前的评论中说,但都在一个地方阅读,这里:http://answered.site/development-environment-setup-uses-tomcat-6-jdk-6-why-does-it-work/603017/
在 JDK1.8 (Java8) 的 tomcat-8 中也发现了该问题
【讨论】:
...但answered.site 链接没有。 是的,其他网站不工作,但仍然可以在support.assetbank.co.uk/hc/en-gb/articles/…看到 感谢您的提示和链接。它有点帮助 - 不幸的是,在我的情况下,生成的 Java/类文件的大小只减少了 2%。【参考方案8】:对于 wildfly 服务器,在standalone.xml -> undertow 子系统内:将 jsp-config 替换为
<jsp-config development="true" mapped-file="false"/>
【讨论】:
【参考方案9】:Eidt:给定的解决方案没有解决方案,但解释错误(问题无法在所有 tomcat 版本上重现)抱歉。
【讨论】:
【参考方案10】:我今天偶然发现了这个问题 我的问题解决了,因为我使用的是 Tomcat 8.0.30 而不是 Tomcat 8.0.39
【讨论】:
太棒了,但这对我来说确实很有帮助(必须让一个旧项目运行才能修复某些问题)。我最初使用的是 apache-tomcat-7.0.78,但我得到了上述异常。然后我尝试使用 apache-tomcat-8.0.46,但仍然出现异常。最后,我尝试了 Apache 存档中的 apache-tomcat-8.0.30,它确实有效。我不会依赖它进行生产,而是快速运行错误修复会话。完美的。谢谢。【参考方案11】:如果您要在带有嵌入式 tomcat 的 Spring Boot 上修复此错误 _jspService is exceeding the 65535 bytes limit
,您可以在您的 application.properties
中使用此配置:
server.servlet.jsp.init-parameters.mappedfile=false
【讨论】:
以上是关于_jspService 超出了 65535 字节的限制的主要内容,如果未能解决你的问题,请参考以下文章
异常 java.lang.NullPointerException at org.apache.jsp.index_jsp._jspService(index_jsp.java:124)