2011-03-30 182 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

相關問題