既然是简述,就说的简单一点了,由于 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 容器的类加载并无严格规范,具体实现是交由容器本身来作的,因此不一样的容器在实现细节上会有不一样。但愿各位看客能够提供补充。资源