classloader常見問題總結

h tp://yourenyouyu2008.iteye.com/blog/779707看到一些ClassNoFindException ,ClassCastException等異常首先應該想到是否是ClassLoader引發的。html

各服務器的ClassLoader策略不一樣一致

一樣的一個war在tomcat,jboss,weblogic等環境下不必定都能正常運行,是因爲這些服務器的ClassLoader策略不徹底同樣,對包衝突的解決辦法不同。最好的辦法是引入maven的包管理機制,根據不一樣的服務器生成不一樣的war。java

java.lang.ClassCastException

Caused by: java.lang.ClassCastException: org.hibernate.ejb.HibernatePersistence cannot be cast to javax.persistence.spi.PersistenceProvider
 at javax.persistence.Persistence.findAllProviders(Persistence.java:112)
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
 at org.jboss.seam.persistence.EntityManagerFactory.createEntityManagerFactory(EntityManagerFactory.java:85)
 at org.jboss.seam.persistence.EntityManagerFactory.startup(EntityManagerFactory.java:50)web

 

這是一個基於jpa的web項目,一樣的war在tomcat下運行是沒有問題的,但在jboss下卻包上面的異常。這說明正常狀況下HibernatePersistence 應該能轉換成PersistenceProvider,不能轉換的緣由就是這兩個類是由不一樣的加載器加載的。搜索jboss classloader查找解決方案,設置server\default\deploy\JBoss-web.deploy\META-INF\JBoss-service.xml 文件中的<attribute name="UseJBossWebLoader">true</attribute>.api

 

jboss classloader

http://www.blogjava.net/agapple/archive/2008/10/23/236142.htmltomcat

 

 

java.lang.ClassNotFoundException:javax.el.ELResolver

有個初學jsf的同事在tomcat下運行jsf的官方demo,總時報java.lang.ClassNotFoundException: javax.el.ELResolver異常,而一樣的tomcat,demo在別人的電腦上沒有一點問題,百思不得其解時從網上搜到了下面的信息:若是把jsp-api.jar  或者servlet-api.jar放入到了 jdk   /jre/lib/ext包下面就會出現  java.lang.ClassNotFoundException: javax.el.ELResolver異常,解決方法,在jre/lib/ext包下面刪除那兩個包就好了。原文連接http://hi.baidu.com/java_hl/blog/item/cd93202a4c9a154a4ec22660.html服務器

一檢查她的jdk/jre/lib/ext包下確實有jsp-api.jar和servlet-api.jar兩個jar,刪除後一切正常。app

按照往常的經驗是不會將jsp-api.jar和servlet-api.jar放到jdk/jre/lib/ext下面的,她說創建的項目裏的import javax.servlet老是報錯,網上搜索到把jsp-api.jar和servlet-api.jar放到jdk/jre/lib/ext下面,進一步發現她創建的不是web項目,而是普通的maven項目(對初學者來講太複雜了)。jsp

 

常見異常

java.lang.IllegalAccessError

java.lang.IllegalAccessError: tried to access class javassist.bytecode.StackMapTable$Writer from class org.jboss.seam.util.ProxyFactorymaven

javasist版本衝突,seam使用了低版本的javasist,而運行時使用了高版本的javasistide

相關文章
相關標籤/搜索