_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 那么 现在明白了,taglib 在父页面中,这就是 【参考方案2】:

为什么它可以在 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 分解为单独方法的另一种方法是使用 &lt;c:catch&gt; 将 JSP 分成段。

【讨论】:

您介意详细说明如何通过使用 来强制更多段吗?我找不到关于这个“黑客”的任何其他来源,我现在可以使用它!感谢您的麻烦! 没关系 - 找到了一个“更干净”的解决方案 (jsp:include),能够阅读有时会很有帮助:) 要使用包含,您必须创建更多文件。这通常很好。但如果不是,请将页面中的代码分成用 包裹的块。这会强制生成的 servlet 将页面分解为多个方法。【参考方案4】:

我的静态 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 的 &lt;c:catch&gt; 解决方案听起来也是不错的选择。

【讨论】:

谢谢,这个解决方案帮了我很多,节省了我的时间。【参考方案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”。这应该返回一个包含一些&lt;init-param&gt; 值的&lt;servlet&gt; 的xml 节点。您需要添加一个额外的&lt;init-param&gt;,如下所示。

<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类文件最大限制

tomcat的jsp页面超过65535,导致500报错

tomcat的jsp页面超过65535,导致500报错

tomcat的jsp页面超过65535,导致500报错

JSP页面的生命周期

异常 java.lang.NullPointerException at org.apache.jsp.index_jsp._jspService(index_jsp.java:124)