關鍵字: was linux 6.1.0.19 snoop classformaterror
環境redhat linux + was 6.1.0.19
部署預設的應用程式 defaultapplication.ear,通路 /snoop時,出現頁面顯示不完整,隻顯示 servlet name: 并到 request information: 這兩項的内容,
然後在頁面的源碼最下面有一行,雖然源碼在最後一行,但是顯示卻是顯示在表格上方,即在 request information: 下面

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)
隻能說明是包壞了,從另一台機器上面執行同樣的解壓測試,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>");
}
srtservletrequest.java

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();
}
說明了什麼問題?匿名類也是僅在需要的時候才去load,而不是跟主類一并全load進去。于是 snoopservlet可以執行一部分,而後面才出錯。