天天看點

開發那點事系列二 - ClassLoader trouble shooting references

         工作中需要解決一些servlet容器類加載器的問題,尤其是jboss 4.x系列,比方說log4j版本沖突需要靠更改配置項java2classloadingcompliance,usejbosswebloader;ear包部署,出現nosuchmethoderror,nosuchfielderror,noclassdeffounderror等(二進制相容錯誤)需要進行類隔離(在 jvm加上-xx:+traceclassloading  -xx:+traceclassunloading分析完類的加載解除安裝verbose)等。除此之外,還有一種classloader問題比較常見。即:如果類庫提供了

spi 接口,并且利用線程上下文類加載器來加載 spi 實作的 java 類,有可能會找不到 java 類。如果出現了 noclassdeffounderror異常(初始類加載器,定義類加載器問題),則可以先檢查目前線程的上下文類加載器是否正确。通過 thread.currentthread().getcontextclassloader()就可以得到該類加載器。該類加載器應該是該子產品對應的類加載器。如果不是的話,可以首先通過 class.getclassloader()來得到子產品對應的類加載器,再通過

thread.currentthread().setcontextclassloader()來設定目前線程的上下文類加載器。關于上下文加載器,一個顯著的使用場景是javax.xml.parsers.documentbuilderfactory類中的newinstance方法,跟進去後代碼具體如下:

最後,将自己曾經參考過的文獻資料分享給大家,希望能對大家有所幫助。

8. http://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html

9. http://www.artima.com/insidejvm/blurb.html

10. http://articles.qos.ch/classloader.html