设为首页 收藏本站
查看: 708|回复: 0

[经验分享] Weblogic启动时classloader加载顺序

[复制链接]

尚未签到

发表于 2017-2-16 08:26:12 | 显示全部楼层 |阅读模式
  摘自:http://hi.baidu.com/iduany/item/f5b5433f3a112b4c3075a1c8
 
 
Weblogic启动时classloader加载顺序

  Weblogic默认情况下采用的是parent first的方式。但这个parent first,是有“讲究”(tricky)的。  
       1. 父类加载器和子类加载器之间的关系类似于Java中,父类和子类之间的对象关系。  
      2. Weblogic会将所有load到的class缓存到cache中。(子类classloader能看到父类classloader加载到cache中的class)。 
 
      默认情况下,当我们的应用程序(ear,war)运行时,会先去cache中查找class,如果找不到。就去System Classpath loader 里去找class。如果System Classpath loader里能找到你需要的类,那么不好意思,你在ear和war包里包含的class就没用了。如果System ClassPath Loader找不到,接下来去ear的class path里找,接着去EJB class path里找,最后到war的class path里找。一旦找到了该类,就会load起这个类,并将该类放入cache中。 
  总的来说,Weblogic的ClassLoader有如下几个层次,按照从高到低顺序排列: 
 1. JDK Classloader 
 2. JDK ext Class Loader 
 3. Weblogic System Class Loader 
 4. Domain Class Loader(Child of System Class Loader) 
 5. App Class Loader  (负责装载应用中的所有的EJB JAR文件)
 6. Web Class Loader  (负责装载所有的Web application 中的WAR文件(所有得jsp文件除外)
 7. JSP Class Loader  (负责装载Web application 中的所有的jsp文件)
 
可以从Weblogic官方文档获取更多的关于Weblogic ClassLoader的信息:http://docs.oracle.com/cd/E23943_01/web.1111/e13706/classloading.htm#autoId32
 
若要修改它的加载顺序,可以通过在Weblogic.xml(版本为8)中加入以下代码:
    <container-descriptor> 
       <prefer-web-inf-classes> true </prefer-web-inf-classes> 
    </container-descriptor> 
  最后,总结一下,在Weblogic服务启动的过程中,自动形成一个具有层次结构的类装载器,首先装载jdk及java扩展jar包或类;然后再加载Weblogic本身使用的各个jar包或类;然后再加载Web应用文件夹里面的classes下的类,然后再加载Web应用文件夹里面lib下的jar包或类。也就是说,每个层次的类装载器均对应不同的类路径,它们是一一对应的。 比如System装载器对应着jdk及扩展路径;Application装载器对应着Weblogic的相关类;而web 应用装载器对应着webapp应用下的classes和lib下的路径;而jsp装载器则对应着jsp文件。
  当然,在加载过程中,若在高层次的加载器中已经加载了某类,那么再以后的加载中,再次遇到该类也不会加载,只是会忽略。加载完成之后,将类放入Cache中供系统应用调用。
  在系统的运行过程中,若遇到使用该类的情况,则会遵循先通过其父类加载器进行加载的原则,比方说,我要加载一个WSWordManager类,则系统会首先在Cache中寻找,若找不到,则调用父装载器到与之对应的路径里面去寻找,一直向上,找着了则进行加载,若找不着则报出ClassNotFound的异常。
  Tomcat与Weblogic有些地方是相反的:对于运行在 Java EE 容器中的 Web 应用来说,类加载器的实现方式与一般的 Java 应用有所不同。不同的 Web 容器的实现方式也会有所不同。以 Apache Tomcat 来说,每个 Web 应用都有一个对应的类加载器实例。该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-342722-1-1.html 上篇帖子: weblogic通过JMX获取连接池信息 下篇帖子: 优化WebLogic 服务器性能参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表