关于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 weblogic生成的class
WebLogic 10 安装、配置和部署详解 本文档提供了对 WebLogic 10 的安装、配置和部署的详细指南。首先,我们将指导您如何安装 WebLogic 10,包括创建域、配置数据源和部署应用程序。然后,我们将深入探讨每个步骤的...
- Security policy file:设置为 C:\BEA\WebLogic10\server\lib\weblogic.policy。 - JAAS login configuration file:选择 Null,因为 WebLogic 10 不支持该特性。 - JDK 设置:确保已安装的 JDK (C:\BEA\jdk150...
本文将详细介绍如何对WebLogic 8 和 WebLogic 10 进行巡检以及遇到问题时如何进行排查。 #### WebLogic 巡检方法 **1. 登录控制台** - **WebLogic 10 版本:** 通过IP+端口+/console访问控制台,如果是集群,则...
本文将详细介绍如何在MyEclipse环境中安装和配置Weblogic 10。Weblogic是由Oracle公司提供的一个企业级Java应用服务器,而MyEclipse是一款强大的Java EE集成开发环境。两者结合可以为开发者提供一个便捷的开发和部署...
在这个“Weblogic10中文版部署全过程”中,我们将详细介绍如何在中文环境下安装并配置WebLogic Server 10。 首先,在部署WebLogic Server 10之前,需要对应用包进行一些预处理。对于`web.xml`文件,要进行如下操作...
WebLogic 10是其众多版本中的一个,提供了对于Java EE 5规范的支持。WebLogic 10的部署涉及到一系列步骤,包括环境的搭建、域配置、数据源设置以及Web应用的部署等。 首先,WebLogic域(Domain)是管理服务器、集群...
安装完成后,WebLogic Server的默认管理员用户名是`weblogic`,密码则根据描述是`weblogic10`。在生产环境中,强烈建议修改这个默认密码以增强安全性。 为了更深入地理解WebLogic Server的静默安装,你应该查阅...
首先,对于WebLogic Server 10.x版本,特别是10gR3(10.3.x),它主要支持的操作系统包括Windows、Linux、Solaris、AIX、HP-UX等。在JDK版本上,10gR3通常需要JDK 1.5或1.6,具体依赖于所使用的WebLogic版本细节。在...
最后输入你想要的Domain名称,比如`weblogic10mss`。 ```bash su - weblogic cd /oracle/weblogic/wlserver_10.3/common/bin ./config.sh ``` 1.4 启动WebLogic Server 在创建好的Domain目录下,执行`start...
最后,输入新的Domain名称,例如`weblogic10mss`。 5. **启动WebLogic Server**: Domain创建完成后,可以在其根目录下通过执行`./startWebLogic.sh`脚本来启动WebLogic Server。启动过程中,可以看到Java内存参数...
【标题】WebLogic 10在Linux上的安装及项目部署 WebLogic Server是Oracle公司的一款企业级Java应用服务器,广泛用于构建、部署和管理大型分布式Web应用。在Linux平台上安装WebLogic 10并进行项目部署是许多IT专业...
将应用部署到 WebLogic 10 及 Oracle Linux 遇到的问题及解决方案 在将应用部署到 WebLogic 10 及 Oracle Linux 的过程中,我们遇到了多种问题,这些问题都与 Java 语言和 WebLogic 服务器相关。在本文中,我们将...
《WebLogic10配置部署详解》 WebLogic Server 10 是一款由甲骨文公司提供的企业级应用服务器,它提供了一个强大的平台来部署和管理Java EE应用程序。在本文中,我们将详细阐述WebLogic10的配置和部署过程,以帮助...
WebLogic Server 10 是甲骨文公司的一款企业级应用服务器,它提供了强大的Java EE应用程序部署和管理功能。本篇文章将深入探讨WebLogic Server 10的详细配置以及性能优化策略,旨在帮助管理员和开发者更好地理解和...
1. **定位到Domain目录**:使用`cd`命令进入`/oracle/weblogic/user_projects/domains/weblogic10mss`目录。 2. **启动WebLogic服务**:执行`./startWebLogic.sh`命令来启动WebLogic服务。 3. **监控启动过程**:...
1. 通过【开始】→【所有程序】→【OracleWebLogic】→【Weblogic Server 10gR3】→【Tools】选择【Configuration Wizard】启动配置向导。 2. 在配置向导中创建WebLogic域,设置域的来源,管理员用户名和密码(默认...