剖析在WAS 6.1.0.19上碰到/snoop時執行不完整而出現ClassFormatError
剖析在WAS 6.1.0.19上碰到/snoop時執行不完整而出現ClassFormatError
關鍵字: WAS Linux 6.1.0.19 snoop ClassFormatError
環境RedHat Linux + WAS 6.1.0.19
部署默認的應用程序 DefaultApplication.ear,訪問 /snoop時,出現頁麵顯示不完整,隻顯示 Servlet Name: 並到 Request Information: 這兩項的內容,
然後在頁麵的源碼最下麵有一行,雖然源碼在最後一行,但是顯示卻是顯示在表格上方,即在 Request Information: 下麵
於是隻好看此君隱藏在哪個jar裏了,通過 JarClassFind 發現在 AppServer/plugins/com.ibm.ws.webcontainer_2.0.0.jar 中。
於是隻能通過測試此包是否真的有問題。拷貝一個到另一個目錄下,然後執行
在執行解壓的過程當中會出現如下錯誤:
隻能說明是包壞了,從另一台機器上麵執行同樣的解壓測試,OK,一切正常,那就下載一個過來,覆蓋後重新啟動之即可。
附Java Doc的解釋為:
當 Java 虛擬機試圖讀取類文件並確定該文件存在格式錯誤或無法解釋為類文件時,拋出該錯誤。
與
和
由於在生產環境,壞的包無法拿出來,放上本機正常包的麵目,如下圖:

真是見怪不怪了。
正常情況下/snoop接下來應當是顯示 Request headers: 相關的內容了。
剖析一下看。。。
SRTServletRequest.java
說明了什麼問題?匿名類也是僅在需要的時候才去Load,而不是跟主類一並全Load進去。於是 SnoopServlet可以執行一部分,而後麵才出錯。
部署默認的應用程序 DefaultApplication.ear,訪問 /snoop時,出現頁麵顯示不完整,隻顯示 Servlet Name: 並到 Request Information: 這兩項的內容,
然後在頁麵的源碼最下麵有一行,雖然源碼在最後一行,但是顯示卻是顯示在表格上方,即在 Request Information: 下麵
- java.lang.ClassFormatError com/ibm/ws/webcontainer/srt/SRTServletRequest$2 unexpected EOF at offset=1240
java.lang.ClassFormatError com/ibm/ws/webcontainer/srt/SRTServletRequest$2 unexpected EOF at offset=1240
於是隻好看此君隱藏在哪個jar裏了,通過 JarClassFind 發現在 AppServer/plugins/com.ibm.ws.webcontainer_2.0.0.jar 中。
於是隻能通過測試此包是否真的有問題。拷貝一個到另一個目錄下,然後執行
jar xvf com.ibm.ws.webcontainer_2.0.0.jar
在執行解壓的過程當中會出現如下錯誤:
- java.util.zip.ZipException: invalid entry size (expected 1240 but got 1242 bytes)
- at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java(Compiled Code))
- at java.util.zip.ZipInputStream.read(ZipInputStream.java(Compiled Code))
- at sun.tools.jar.Main.extractFile(Main.java(Compiled Code))
- at sun.tools.jar.Main.extract(Main.java:718)
- at sun.tools.jar.Main.run(Main.java:228)
- at sun.tools.jar.Main.main(Main.java:994)
java.util.zip.ZipException: invalid entry size (expected 1240 but got 1242 bytes) at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java(Compiled Code)) at java.util.zip.ZipInputStream.read(ZipInputStream.java(Compiled Code)) at sun.tools.jar.Main.extractFile(Main.java(Compiled Code)) at sun.tools.jar.Main.extract(Main.java:718) at sun.tools.jar.Main.run(Main.java:228) at sun.tools.jar.Main.main(Main.java:994)
隻能說明是包壞了,從另一台機器上麵執行同樣的解壓測試,OK,一切正常,那就下載一個過來,覆蓋後重新啟動之即可。
附Java Doc的解釋為:
public class ClassFormatError extends LinkageError
當 Java 虛擬機試圖讀取類文件並確定該文件存在格式錯誤或無法解釋為類文件時,拋出該錯誤。
與
unexpected EOF at offset=1240,應當在1240結束,但卻沒有。
和
expected 1240 but got 1242 bytes,變多了2個字節,嗬嗬:)
由於在生產環境,壞的包無法拿出來,放上本機正常包的麵目,如下圖:

真是見怪不怪了。
正常情況下/snoop接下來應當是顯示 Request headers: 相關的內容了。
剖析一下看。。。
- SnoopServlet.java
- e = req.getParameterNames();
- if ( e.hasMoreElements() )
- {
- out.println("<h2>Servlet parameters (Single Value style):</h2>");
- out.println("<TABLE Border=/"2/" WIDTH=/"65%/" BGCOLOR=/"#DDDDFF/">");
- while ( e.hasMoreElements() )
- {
- String name = (String)e.nextElement();
- out.println("<tr><td>" + name + "</td><td>" + req.getParameter(name) + "</td></tr>");
- }
- out.println("</table><BR><BR>");
- }
- public Enumeration getAttributeNames()
- {
- /* 225*/ if(TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
- /* 226*/ Tr.debug(tc, "getAttributeNames [" + this + "]");
- /* 228*/ return new Enumeration() {
- public boolean hasMoreElements()
- {
- /* 231*/ return iter.hasNext();
- }
- public Object nextElement()
- {
- /* 235*/ return iter.next();
- }
- private Iterator iter;
- {
- /* 229*/ iter = _srtRequestHelper._attributes.keySet().iterator();
- }
- }
最後更新:2017-04-02 00:06:48