2011-03-30 47 views
17

Por lo tanto, estoy tratando con un código de servlet heredado que se ejecuta en Websphere 7 (JDK 6). La configuración del entorno de desarrollo usa Tomcat 6 (JDK 6)._jspService excede el límite de 65535 bytes

  1. ¿Por qué funciona en Websphere 7 y no en Tomcat 6?
  2. ¿Esto está relacionado con el servidor de aplicaciones ?

Si su respuesta es sí para no. 2, ¿tiene una solución para esto en Tomcat 6 (JDK 6) además de desglosar el código o usar includes dinámicos?

El horario no concuerda con el cambio de estático incluye a dinámico incluye principalmente porque la mayoría de las páginas se combinan con el código del modelo de negocio, incluida la plantilla principal de la aplicación.

+1

Por qué no puedes utilizar Websphere para el desarrollo? – WhiteFang34

+0

Descarga de WAS 6 express ahora. – Joset

+0

Quizás la siguiente pregunta es, ¿es posible cambiar el límite de tamaño de método de la JVM? – Joset

Respuesta

18

Parece que está golpeando un 64k method limit, probablemente debido a la forma en que Tomcat crea una clase de su JSP. This page sugiere cambiar su estática incluye la siguiente manera:

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

Para dinámico incluye como esta para evitar el problema:

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

sí, soy consciente de esto, he reformulado mi última pregunta, eso es lo que quise decir: dynamic incluye – Joset

+0

Ah. Dudo que tengas muchas opciones con Tomcat, a menos que quieras hackearlo para romper métodos largos para evitar la limitación. No hay garantía de cómo el contenedor web divide su JSP en Java para ser compilado en una clase. Tendrá que encontrar un contenedor que le pase de manera diferente que Tomcat, ¿quizás pruebe Jetty o Resin? – WhiteFang34

+0

lo mismo para mí. ¡Gracias! – migueloop

2

¿Por qué funciona en WebSphere 7 y no en Tomcat 6

Porque tienen diferentes compiladores JSP que traducen las JSP a diferentes códigos Java. El compilador Tomcat JSP (Jasper) aparentemente no puede tratar con JSP grandes.

Quizás la siguiente pregunta es, ¿es posible cambiar el límite de tamaño de método de la JVM?

No. Estos límites están cableados en el formato/estructura de los archivos de clase.

Los detalles están en el JVM spec ... pero es bastante complicado, y no está del todo claro por su pregunta qué límite ha golpeado. (Pero eso es inmaterial ... no pueden ser cambiados.)

+0

En realidad, no es tan simple. El campo method_count limita el número de métodos por clase, no la longitud del código para cada método. El campo relevante, code_length en Code_attribute struct, es un entero sin signo de 32 bits, pero dado que otros atributos indexan el código con enteros sin signo de 16 bits, se especifica adicionalmente en la especificación de formato de archivo de clase que "el valor del elemento code_length debe ser menos de 65536 ". En algunos casos, incluso debe ser inferior a 65535, ya que una instrucción en el índice 65535 no puede ser protegida por un manejador de excepciones. – jarnbjo

+0

el error de acierto tiene que ver con el nombre del método "_jspService", que es en lo que se convierte el código jsp. El compilador no es lo suficientemente inteligente como para dividir un código largo en múltiples (encadenados) "_jspServiceXXX" métodos.El bytecode de un método no puede ser más largo que 65535bytes. Algunas otras herramientas tampoco generan código adecuado. 'asm por ejemplo falla al generar "bytecode" de clases grandes y el error es el mismo. – bestsss

4

En ocasiones, romper su JSP en includes no tiene sentido o no funciona. Otra forma de forzar que su JSP se divida en métodos separados cuando se compila es separar su JSP en segmentos usando <c:catch>.

+0

¿Te importaría elaborar cómo forzar más segements mediante el uso de ? No pude encontrar ninguna otra fuente con respecto a este 'hack', ¡que podría usar ahora mismo! Gracias por tu problema! –

+0

No importa - encontró una solución "limpia" (jsp: incluir), poder leer a veces ayuda mucho :) –

+1

Para usar includes, debe crear más archivos. Esto usualmente está bien. Pero cuando no lo es, divida el código en la página en bloques envueltos con . Esto fuerza al servlet resultante a dividir la página en varios métodos. –

7

me quedé sin bloques estáticos HTML/JSS/css pude exteriorizar en jsp:include (en su mayoría html no estático era izquierda) ...

Usted puede poner en su web.xml, mappedFile establecido en false al igual que a se puede olvidarse de muchas líneas estáticas que no son necesariamente buenos bloques para poner en un include, sino que se suman para ahorrar espacio: la solución de

<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> suena como opción agradable también.

+0

Gracias, esta solución me ayudó mucho y me ahorró tiempo. – mahi

0

Al configurar el parámetro de inicialización "mappedFile" a "falso" funcionó para mí.

Pero al usar el plugin eclipse, algunas veces se elimina y necesita establecerse de nuevo en el hogar de tomcat.

3

Para JBoss eap 6 en standalone.xml, agregue el siguiente código en el subsistema web.

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

Resolvió mi problema.

4

mejor a punto directo, donde para cambiarlo como se indica en siguiente enlace: https://www.assetbank.co.uk/support/documentation/knowledge-base/byte-limit-exceeded-error/

Busque el [TOMCAT_HOME] /conf/web.xml archivo y buscar en el archivo para 'JspServlet'. Esto debería devolver un nodo xml de <servlet> que contiene algunos valores <init-param>. Necesitará agregar un <init-param> adicional de la misma manera que a continuación.

<init-param> 
    <param-name>mappedfile</param-name> 
    <param-value>false</param-value> 
</init-param> 

Eso es más clara y directa para el usuario tomcat

Otras soluciones de referencia que, por supuesto, dijo que sobre todo en el comentario anterior, pero todo en un solo lugar para leer, aquí: http://answered.site/development-environment-setup-uses-tomcat-6-jdk-6-why-does-it-work/603017/

El problema también se encontró en Tomcat-8 con JDK1.8 (Java8)

0

Para el servidor JBoss, en standalone.xml -> dentro subsistema de resaca: sustituir jsp-config con

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

Eidt: La solución dada no era la solución, pero la falta de interpretación (el problema no se puede reproducir en todas las versiones de tomcat) lo siento.

1

me encontré con este problema hoy
Mi problema fue resuelto mientras tomaba Tomcat 8.0.30 en lugar de Tomcat 8.0.39

+1

Sorprendente, pero esto realmente me ayudó en mi caso (tenía que ejecutar un proyecto antiguo para corregir algo). Inicialmente utilicé apache-tomcat-7.0.78 con el cual obtuve la excepción anterior. Luego probé con apache-tomcat-8.0.46, pero todavía obtuve la excepción. Finalmente probé Apache-tomcat-8.0.30 del archivo de Apache y realmente funcionó. No confiaría en esto para la producción, sino para ejecutar rápidamente una sesión de corrección de errores. Perfecto. Gracias. – stefitz

Cuestiones relacionadas