既然是簡述,就說的簡單一點了,由於 Java 的類加載是一個很大的話題。不少技術,例如 Java EE 容器、OSGi 容器、JVM 上面的動態語言,都有本身在類加載上的特殊之處。java
<br/> 先回顧一下 JVM 類加載的基本知識點:dom
從上面的這個圖咱們能夠看到,類加載器在加載某個類的時候會先將加載請求提交給它的父加載器,逐級上交。若是出於最根部的 Bootstrap Classloader 不能加載此類,類的加載請求會逐級向下傳遞,直到那個能加載到這個類的類加載器。代理
這麼作的緣由在於,我想,沒有人會但願下面這個狀況的發生。像 JDK 中的那些公用的類,同一個類會由於被不一樣的類加載器加載,而被認爲是不一樣的類。同時,公用的類被屢次加載也是對資源的浪費。code
<br/> Java EE 應用常以 EAR 格式來部署,這種格式也相較於 WAR 複雜,因此就只以 EAR 爲例介紹了。xml
EAR 包中能夠存在一個或多個 EJB-JAR 包和一樣能夠一個或多個的 WAR 包。EAR 包在 Java EE 容器中會有本身的類加載器,同時 EJB-JAR 和 WAR 也有本身的類加載器。EAR 包的類加載器會是 其 EJB-JAR 包和 WAR 包類加載器的父加載器。若是 WAR 包依賴某個 EJB-JAR 包,那這二者的類加載器會成父子關係。htm
<br/> JBoss AS 7 在默認的配置下,其類加載機制和上述 Java EE 容器的類加載有所不一樣。默認狀況下,JBoss AS 中一個 EAR 包的 WAR 和 EJB-JAR 的類加載器對互相的類都是可見的。這個配置能夠經過修改 standalone.xml 來實現,加入以下配置:ssl
<!-- lang: xml --> <subsystem xmlns="urn:jboss:domain:ee:1.0" > <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </subsystem>
<br/> Java EE 容器的類加載並無嚴格規範,具體實現是交由容器本身來作的,因此不一樣的容器在實現細節上會有不一樣。但願各位看客能夠提供補充。資源