`
三问飞絮
  • 浏览: 320600 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Weblogic10 Classloading 问题<转>

    博客分类:
  • Java
 
阅读更多

首先要说说Weblogic的classloading的机制(不同的Applicaiton Server,classloading的方式各有不同)。简而言之,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中。

上面的描述,没什么奇怪,但需要注意的是下面的情况。当应用程序执行时,classloader需要的类还未在classloader里存在。默认情况下,此时classloader会由上至下从class path里找,也就是说先去System和Application的class path里找,而不是先向war的class path里找。所以,这种情况下,如果application的class path里能找到所需要的class,那么就算war的class path里有同样的class,war里的class是不会被load到的。

 

假设情况1:(只在webapp里有class A)

No Class A in current class loader cache -> Find System class path (Not found class A) -> Find Application class path (Not found class A) -> Find EJB class path (Not found class A) -> Find WebApp class loader (Found class A)

假设情况2:(在application和webapp里都有class A)

No Class A in current class loader cache -> Find System class path (Not found class A) -> Find Application class path (Found class A)

 

实际案例:

前几天,有同事用到一个第三方类库wsdl4j.jar,并该类库放在在Webapp的lib目录里。但是系统运行时,总是报类库版本不对的错误。问题就是在于,之前该项目在Application的class path里已经存在该类库了(给其他的war用),而且application class path里的类库和war里用的是不同的版本。

 

app.ear

|----->lib

            |-->wsdl4j.jar

|------>a.war (using wsdl4j.jar in ear/lib)

|------>b.war (using wsdl4j.jar in ear/lib)

|------>c.war (using wsdl4j.jar in war/lib)

             |---->WEB-INF

                      |---->lib

                                |--->wsdl4j.jar

 

解决方法:

weblogic提供了一个标签<prefer-web-inf-classes>,这个标签默认是false的,只要设置这个标签为true,就可以让WEB-INF里的类先被load到了。

 

特殊案例:(当第三方jar和weblogic.jar有冲突)

项目中使用CXF的webservice,CXF里有自己的javax.jws.*实现,而weblogic.jar里也有类似实现,Weblogic启动的时候似乎已经把weblogic.jar里的类都load进所谓的system classpath classloader了,程序在使用javax.jws.*的类时,类已经被system classpath classloader加载了,所以就算使用<prefer-web-inf-classes>标签也没有用。CXF总是用不上自己的javax.jws.*。

 

解决方法:

根据weblogic的官方文档,只要是在$CLASSPATH里的jar包都会在weblogic启动的时候load起来,存入“system classpath classloader”的cache里,所以程序运行时,classloader先从cache里找class,也就找到weblogic.jar里的javax.jws.*,所以永远不会尝试查找CXF里的javax.jws.*了。weblogic9以后提供了一个新的标签<prefer-application-packages>。用这个新标签能够让应用程序遇到javax.jws.*时,程序会直接到指定的ear的application class loader里找类,而不使用在“system classpath classloader”里的class。

 

大部分情况下,使用<prefer-web-inf-classes>,应该能解决classloading的问题,在<prefer-web-inf-classes>不生效的时候,就考虑使用<prefer-application-packages>。在网上还有人提到,同时使用这两个标签(一个在weblogic.xml里设,另一个在weblogic-application.xml在设)时,<prefer-web-inf-classes>的配置无效,这个问题还有待考证。

 

Reference:

http://chang.baidu.com/e_ville/snap/90dd96b459e4b1f74394861f.html

http://e-docs.bea.com/wls/docs100/programming/classloading.html#wp1082452

http://svn.apache.org/repos/asf/webservices/axis2/site/1_4/app_server.html

分享到:
评论

相关推荐

    jive.chm

    2 MakeWAR.jar文件中的MakeWAR.class源代码MakeWAR.java &lt;br&gt; 3 为Jive写的补丁程序patcher.jar的源程序 &lt;br&gt; 4 WebLogic中文问题配置文件 &lt;br&gt; 5 JSP系统信息配置探针 &lt;br&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;反编译与混淆&lt;br&gt; 1 編譯、...

    JSP高级编程

    预备知识 &lt;br&gt;2.1 Java程序设计基础 &lt;br&gt;2.1.1 Java语言规则 &lt;br&gt;2.1.2 Java变量和函数 &lt;br&gt;2.1.3 子类 &lt;br&gt;2.1.4 this和super &lt;br&gt;2.1.5 类的类型 &lt;br&gt;2.1.6 抽象类 &lt;br&gt;2.1.7 接口 &lt;br&gt;2.1.8 包 &lt;br&gt;2.2 JavaBeans...

    Terac Miracle v2.0

    &lt;br&gt;Multi-languages(English/Chinese...) &lt;br&gt;Fully customizable templates &lt;br&gt;Categories &lt;br&gt;Comments &lt;br&gt;Files upload &lt;br&gt;RSS syndication &lt;br&gt;WYSIWYG editor &lt;br&gt;*Multi-Users &lt;br&gt;*Static HTML &lt;br&gt;*...

    <<J2EE应用与BEA.WebLogic.Server第2版>>part1 电子速度PDF格式

    J2EE应用与BEA.WebLogic.Server第2版&lt;br&gt;超过10mb&lt;br&gt;分三部分&lt;br&gt;第一部分

    Tomcat下发布JSP程序的N种方法

    &lt;br&gt;&lt;br&gt;loadable(搂得抱)意义为:适于承载的, 可受载的&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;web应用服务器Bea weblogic8.1 设置虚拟目录&lt;br&gt; &lt;br&gt;安装WebLogic8.1, 创建好myDomain域. &lt;br&gt;----------------------------------------...

    jsp+servlet+javabean成绩管理系统

    采用jsp+servlet+javabean,jsp负责...&lt;br&gt;开发调试平台为jbuilder9+tomcat4,在resin和weblogic下测试通过。&lt;br&gt;数据库平台为ms sql server2000&lt;br&gt;数据库连接池为apache组织下jakarta项目组开发的commons-dbcp 1.0

    <<J2EE应用与BEA.WebLogic.Server第2版>>part3 电子速度PDF格式

    J2EE应用与BEA.WebLogic.Server第2版&lt;br&gt;超过10mb&lt;br&gt;分三部分&lt;br&gt;第三部分

    <<J2EE应用与BEA.WebLogic.Server第2版>>part2 电子速度PDF格式

    J2EE应用与BEA.WebLogic.Server第2版&lt;br&gt;超过10mb&lt;br&gt;分三部分&lt;br&gt;第二部分

    行运2002 Oracle论坛

    &lt;br&gt; 在tomcat、TongWeb、weblogic下测试成功;&lt;br&gt; &lt;br&gt; 主要功能:&lt;br&gt; =====================================================&lt;br&gt; 1、论坛分类:有大类一级及其下的版面 2级组成;&lt;br&gt; 2、发贴、回复的认证,发贴...

    CVE-2021-2394工具包

    -jndi &lt;arg&gt; JNDI地址 weblogic JNDI注入选这项填入地址 -Jport &lt;arg&gt; JRMPListener监听 输入监听端口,在本机开启JRMPListener输 -os &lt;arg&gt; window/linux 目标主机系统 不选默认为window -P &lt;arg&gt; Remote Port ...

    WebLogic反序列化_CVE-2017-3248

    -C &lt;arg&gt; (执行命令)Execute Command[need set] -dst &lt;arg&gt; path to dst file -H &lt;arg&gt; (执行主机)Remote Host[need set] -https enable https or tls -noExecPath custom execute path -os &lt;arg&gt; (操作...

    ATGrid报表控件/插件V2.1.7.711

    &lt;br&gt;8、支持MIS开发的各种开发工具:如VC、VB、Delphi、C++Bulider、InterDev &lt;br&gt;9、支持WEB开发,FrontPage、InterDev、ASP.NEt、C# &lt;br&gt;10、EtCell内置支持VBScript脚本包括事件 &lt;br&gt;11、在WEB上支持VBScript、...

    JAVA基础

    大型应用服务器,如oracle application server,IBM webspere,bea weblogic&lt;br&gt;3。无线领域:WAP GATEWAY,JAVA通信软件&lt;br&gt;4。嵌入式领域:如手机游戏,嵌入式设备应用程序,java芯片&lt;br&gt;5。Java图形,如GIS平台的...

    Weblogic监控jndi泄露连接的方法.doc

    例如,日志条目 `####&lt;日期&gt; &lt;时间&gt; &lt;Info&gt; &lt;mon&gt; &lt;应用名&gt; &lt;服务器名&gt; &lt;线程名&gt; &lt;&lt;匿名&gt;&gt; &lt;&gt; &lt;&gt; &lt;错误码&gt; &lt;消息&gt;` 描述了创建或释放连接的情况,可以帮助分析连接生命周期。 总结来说,解决 WebLogic 中 JNDI 泄露...

    weblogic在eclipse中的配置

    weblogic 8和weblogic 9在eclipse中的配置&lt;br&gt;eclipse的简单安装&lt;br&gt;一个helloworld的简单实例&lt;br&gt;&lt;br&gt;这个也是仿照同学的写的&lt;br&gt;&lt;br&gt;希望对weblogic的入门者有用

    有关WebLogic编程的常见问题

    &lt;servlet-class&gt;weblogic.servlet.ClasspathServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;ClasspathServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/classes/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ...

    weblogic配置数据源

    &lt;td&gt;&lt;%= rs.getObject("deptid") %&gt;&lt;/td&gt; &lt;/tr&gt; &lt;% } %&gt; &lt;/table&gt; &lt;% conn.close(); %&gt; } catch (Exception e) { out.println("数据库连接失败:" + e.getMessage()); } %&gt; &lt;/body&gt; &lt;/html&gt; ``` #### 四、...

    timer部署与基本操作

    在`&lt;weblogic&gt;`标签中,可以指定服务器版本、XML编码、数据源等信息。例如,通过`&lt;datasource&gt;`元素可以指定数据源的位置,这对于使用数据库的应用程序尤其重要。 #### 六、启动与日志查看 完成上述配置后,即可...

Global site tag (gtag.js) - Google Analytics