`
taojingrui
  • 浏览: 67677 次
  • 来自: ...
社区版块
存档分类
最新评论

Weblogic10 Classloading 问题

阅读更多

 关于Web Application Server的Classloading,网上已经有成千上万的文章讨论过了。最近工作中,在使用weblogic的时候,又遇到了这方面的一些问题,记录下来,方便以后提醒自己。

 

首先要说说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中。

Note: 上图copy自Weblogic的官方网站

 

上面的描述,没什么奇怪,但需要注意的是下面的情况。当应用程序执行,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

http://cwiki.apache.org/CXF20DOC/appserverguide.html#AppServerGuide-swappingOracle%257B%257Bwsdl.jar%257D%257Dwith%257B%257Bwsdl4j.jar%257D%257Dand%257B%257Bjaxb.jar%257D%257DAPIwith%257B%257Bjaxbapi2.0.jar%257D%257D

 

 

 

 

  • 大小: 31.8 KB
分享到:
评论

相关推荐

    weblogic 生成class

    weblogic weblogic生成的class

    weblogic 10官方教程

    WebLogic 10官方教程是Oracle提供的详细指导文档,涵盖了服务器的安装、配置、管理和监控等多个方面,旨在帮助用户深入理解并有效操作WebLogic Server。 1. **WebLogic服务器管理概述** 在WebLogic Server中,管理...

    WebLogic10安装图解

    WebLogic 10 安装、配置和部署详解 本文档提供了对 WebLogic 10 的安装、配置和部署的详细指南。首先,我们将指导您如何安装 WebLogic 10,包括创建域、配置数据源和部署应用程序。然后,我们将深入探讨每个步骤的...

    WebLogic10安装配置.txt

    - Security policy file:设置为 C:\BEA\WebLogic10\server\lib\weblogic.policy。 - JAAS login configuration file:选择 Null,因为 WebLogic 10 不支持该特性。 - JDK 设置:确保已安装的 JDK (C:\BEA\jdk150...

    weblogic日常巡检,问题排查

    本文将详细介绍如何对WebLogic 8 和 WebLogic 10 进行巡检以及遇到问题时如何进行排查。 #### WebLogic 巡检方法 **1. 登录控制台** - **WebLogic 10 版本:** 通过IP+端口+/console访问控制台,如果是集群,则...

    Weblogic10在MyEclipse下的安装及配置

    本文将详细介绍如何在MyEclipse环境中安装和配置Weblogic 10。Weblogic是由Oracle公司提供的一个企业级Java应用服务器,而MyEclipse是一款强大的Java EE集成开发环境。两者结合可以为开发者提供一个便捷的开发和部署...

    WebLogic10配置部署手册

    《WebLogic10配置部署详解》 WebLogic Server 10 是一款由甲骨文公司提供的企业级应用服务器,它提供了一个强大的平台来部署和管理Java EE应用程序。在本文中,我们将详细阐述WebLogic10的配置和部署过程,以帮助...

    weblogic10中文版部署全过程

    在这个“Weblogic10中文版部署全过程”中,我们将详细介绍如何在中文环境下安装并配置WebLogic Server 10。 首先,在部署WebLogic Server 10之前,需要对应用包进行一些预处理。对于`web.xml`文件,要进行如下操作...

    webLogic_10部署

    WebLogic 10是其众多版本中的一个,提供了对于Java EE 5规范的支持。WebLogic 10的部署涉及到一系列步骤,包括环境的搭建、域配置、数据源设置以及Web应用的部署等。 首先,WebLogic域(Domain)是管理服务器、集群...

    Weblogic10静默安装

    安装完成后,WebLogic Server的默认管理员用户名是`weblogic`,密码则根据描述是`weblogic10`。在生产环境中,强烈建议修改这个默认密码以增强安全性。 为了更深入地理解WebLogic Server的静默安装,你应该查阅...

    Oracle Weblogic 10.X、11.X、12.X各个版本对应的系统、JDK、数据库版本

    首先,对于WebLogic Server 10.x版本,特别是10gR3(10.3.x),它主要支持的操作系统包括Windows、Linux、Solaris、AIX、HP-UX等。在JDK版本上,10gR3通常需要JDK 1.5或1.6,具体依赖于所使用的WebLogic版本细节。在...

    weblogic10_for_linux安装文档

    最后输入你想要的Domain名称,比如`weblogic10mss`。 ```bash su - weblogic cd /oracle/weblogic/wlserver_10.3/common/bin ./config.sh ``` 1.4 启动WebLogic Server 在创建好的Domain目录下,执行`start...

    linux下安装weblogic10

    最后,输入新的Domain名称,例如`weblogic10mss`。 5. **启动WebLogic Server**: Domain创建完成后,可以在其根目录下通过执行`./startWebLogic.sh`脚本来启动WebLogic Server。启动过程中,可以看到Java内存参数...

    WebLogic 10 在Linux上的安装及项目部署

    【标题】WebLogic 10在Linux上的安装及项目部署 WebLogic Server是Oracle公司的一款企业级Java应用服务器,广泛用于构建、部署和管理大型分布式Web应用。在Linux平台上安装WebLogic 10并进行项目部署是许多IT专业...

    将应用部署到weblogic10及oracle linux遇到的问题及解决方案

    将应用部署到 WebLogic 10 及 Oracle Linux 遇到的问题及解决方案 在将应用部署到 WebLogic 10 及 Oracle Linux 的过程中,我们遇到了多种问题,这些问题都与 Java 语言和 WebLogic 服务器相关。在本文中,我们将...

    Weblogic10 详细配置及性能优化大全

    WebLogic Server 10 是甲骨文公司的一款企业级应用服务器,它提供了强大的Java EE应用程序部署和管理功能。本篇文章将深入探讨WebLogic Server 10的详细配置以及性能优化策略,旨在帮助管理员和开发者更好地理解和...

    weblogic10_for_linux安装文档.doc

    1. **定位到Domain目录**:使用`cd`命令进入`/oracle/weblogic/user_projects/domains/weblogic10mss`目录。 2. **启动WebLogic服务**:执行`./startWebLogic.sh`命令来启动WebLogic服务。 3. **监控启动过程**:...

    Weblogic10安装和配置

    1. 通过【开始】→【所有程序】→【OracleWebLogic】→【Weblogic Server 10gR3】→【Tools】选择【Configuration Wizard】启动配置向导。 2. 在配置向导中创建WebLogic域,设置域的来源,管理员用户名和密码(默认...

Global site tag (gtag.js) - Google Analytics