一直对classloading的了解不是很清晰,每次遇到涉及WebLogic的classpath设置、classloading问题debug时都要去网上搜索资料。现在把资料整理下来。
各层级classloader加载的类的范围
Bootstrap classloader
- Core Java libraries (
/lib)
- Core Java libraries (
Extension classloader
- JRE extensions directory (
/lib/ext)
- JRE extensions directory (
WebLogic Server system classloader
- Classpath
/lib
Filtering classloader
- nothing
Application classloader
- EJB JARs
- APP-INF/lib
- APP-INF/classes
- Manifest Class-Path in EJB JARs
Web application classloader
- WAR
- Manifest Class-Path in WAR
类加载的优先级
每个classloader在要加载一个class之前都会先请求它的上层classloader,如此逐级传递。因此效果就是越上层的classloader优先级越高,一个class如果在上层classloader能加载到,就不会让下面的classloader加载。
但是web application classloader是个特例,通过在weblogic.xml中配置
Filtering classloader是个特殊的classloader,它并不会加载任何类,而是起到控制类加载优先级的作用。在weblogic-application.xml中配置
其他
以上仅仅描述了缺省情况下classloading的行为。WebLogic对于一个application (EAR)内的classloader的层次结构是可以自定义的。Shared library和optional package,也会影响到classloading。另外,resource adapter (RAR)也有独立的classloader。还有其他的一些细节,需要查阅Understanding WebLogic Server Application Classloading。