2011-03-30 94 views
17

因此,我正在处理在Websphere 7(JDK 6)上运行的旧版Servlet代码。开发环境设置使用Tomcat 6(JDK 6)。_jspService超过65535字节的限制

  1. 它为什么在Websphere 7和 上工作不在Tomcat 6中?
  2. 这是与 应用程序服务器有关吗?

如果你的答案是肯定的没有。 2,除了分解代码或使用动态包含之外,您是否有对Tomcat 6(JDK 6)的解决方法?

时间表不同意静态包括动态包含,主要是因为大多数页面都与业务模型代码相结合,包括应用程序的主要模板。

+1

为什么你不能使用WebSphere发展? – WhiteFang34 2011-03-30 09:45:01

+0

现在下载WAS 6。 – Joset 2011-03-30 09:51:18

+0

也许下一个问题是,是否有可能更改JVM的方法大小限制? – Joset 2011-03-30 09:54:37

回答

18

这听起来像是碰到了64k method limit,这可能是由于Tomcat如何从JSP中构建了一个类。 This page建议改变你的静态包含这样的:

<%@ include file="test.jsp" %> 

动态包括像这样来避免问题:

<jsp:include page="test.jsp" /> 
+0

是的,我知道这一点,我已经改写了我的最后一个问题,这就是我的意思 - 动态包括 – Joset 2011-03-30 09:37:31

+0

啊。我怀疑你对Tomcat有太多的选择,除非你想破解它以分解长期的方法来避免这种限制。 Web容器如何将JSP分解为Java以编译到类中并不能保证。您需要找到一个与Tomcat不同的容器,或许尝试使用Jetty或Resin? – WhiteFang34 2011-03-30 09:44:42

+0

对我来说也是一样。谢谢! – migueloop 2015-02-13 09:59:35

2

为什么它在WebSphere 7中运行,而不是在Tomcat的6

因为它们有不同的JSP编译器,可以将JSP转换为不同的Java代码。 Tomcat JSP编译器(Jasper)显然无法处理大型JSP。

也许下一个问题是,是否有可能更改JVM的方法大小限制?

不可以。这些限制硬连线到类文件的格式/结构中。

详细信息在JVM spec ......但它很复杂,并且从您的问题中并未完全清楚您遇到了哪些限制。 (但这不重要......他们不能改变。)

+0

其实并不那么简单。 method_count字段限制每个类的方法数量,而不是每个方法的代码长度。 Code_attribute结构中的相关字段code_length是一个32位无符号整数,但由于其他属性使用16位无符号整数对代码编制索引,因此在类文件格式规范中另外声明“code_length项的值必须小于65536“。在某些情况下,它甚至必须小于65535,因为索引65535上的指令不能被异常处理程序保护。 – jarnbjo 2011-03-30 12:03:02

+0

命中错误是关于jsp代码变成什么的方法名称“_jspService”。编译器不够智能,无法将长代码拆分为多个(链接)“_jspServiceXXX”方法。方法的字节码不得超过65535个字节。其他一些工具也无法生成正确的代码。 '例如asm在生成大类的“字节码”时失败,错误也是一样的。 – bestsss 2011-03-30 13:28:27

4

有时候把你的JSP分解为包含没有意义或不起作用。编译时强制JSP分解为单独方法的另一种方法是使用<c:catch>将JSP分成多个段。

+0

您是否介意通过使用来详细说明如何强制更多地区?我找不到有关这个'黑客'的其他资料,我现在可以使用它!感谢您的麻烦! – 2012-04-13 15:43:30

+0

没关系 - 找到一个“更清洁”的解决方案(jsp:include),能够读取有时帮助很多:) – 2012-04-17 12:47:41

+1

要使用includes,您必须创建更多文件。这通常很好。但是,如果不是,则将页面中的代码划分为包含的块。这迫使生成的servlet将页面分解为多个方法。 – 2013-05-31 20:31:51

7

我跑出去静态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> 

彼得·哈特的<c:catch>解决方案听起来像是不错的选择也是如此。

+0

谢谢,这个解决方案帮了我很多,并节省了我的时间。 – mahi 2017-06-30 13:09:48

0

通过设置初始化参数“mappedFile”为“false”为我工作。

但是使用eclipse插件有一段时间它被删除并需要在tomcat主页中再次设置。

3

对于standalone.xml中的JBoss eap 6,请在web subsytem下添加以下代码。

<configuration> 
    <jsp-configuration development="true" mapped-file="false"/> 
</configuration> 

它解决了我的问题。

4

不如直接指向哪里去改变它在下面的链接中指出: 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/

问题还发现在Tomcat的8 JDK1.8(Java8)

0

对于wildfly服务器,在standalone.xml - >逆流子系统内:取代的jsp-配置与

<jsp-config development="true" mapped-file="false"/> 
0

Eidt:给定的解决方案没有解决方案,但错误解释(问题不能在所有tomcat版本上重现)抱歉。

1

我碰到这个问题今天无意中发现
我的问题解决了,我把Tomcat的8.0.30,而不是Tomcat的8.0.39

+1

令人惊叹的,但这真的帮助我的情况(不得不让一个旧的项目运行,以纠正某些问题)。我最初使用apache-tomcat-7.0.78与我有上述异常。然后我尝试了apache-tomcat-8.0.46,但仍然有例外。最后我从Apache的档案中尝试了apache-tomcat-8.0.30,它确实有效。 我不会依赖这个来进行生产,但要快速获得运行的bug修复会话。完善。谢谢。 – stefitz 2017-09-27 17:10:45

相关问题