读书人

jboss classloader机制以及scope配备

发布时间: 2012-08-22 09:50:35 作者: rapoo

jboss classloader机制以及scope配置

1.? 概念介绍

UCL : org.jboss.mx.loading.UnifiedClassLoader3 ,它继承标准的java.net.URLClassLoader,覆盖了标准parent delegation模型以使用共享class和资源仓库

?

仓库(responsitory): org.jboss.mx.loading.UnifiedLoaderRepository3。

?

平面模型:为了热deploy模块的需要,JBoss实现了自己的类装载器UnifiedClassLoader3,一般来说,一个顶层的deployment就有一个UnifiedClassLoader3实例为之工作。一个deployment所装载的类,其他 deployment是可见的。全局唯一的UnifiedLoaderRepository3实例用于管理这些类,以及装载它们的UnifiedClassLoader3。UnifiedLoaderRepository3实例和UnifiedClassLoader3实例是一对多的关系。

2. jboss classloader机制
???

jboss classloader机制以及scope配备<mbean?code="org.jboss.management.j2ee.LocalJBossServerDomain"
jboss classloader机制以及scope配备??????name="jboss.management.local:j2eeType=J2EEDomain,name=Manager">
jboss classloader机制以及scope配备??????<attribute?name="MainDeployer">jboss.system:service=MainDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="SARDeployer">jboss.system:service=ServiceDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="EARDeployer">jboss.j2ee:service=EARDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="EJBDeployer">jboss.ejb:service=EJBDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="RARDeployer">jboss.jca:service=RARDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="CMDeployer">jboss.jca:service=ConnectionFactoryDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="WARDeployer">jboss.web:service=WebServer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="CARDeployer">jboss.j2ee:service=ClientDeployer</attribute>
jboss classloader机制以及scope配备??????<attribute?name="MailService">jboss:service=Mail</attribute>
jboss classloader机制以及scope配备??????<attribute?name="JMSService">jboss.mq:service=DestinationManager</attribute>
jboss classloader机制以及scope配备??????<attribute?name="JNDIService">jboss:service=Naming</attribute>
jboss classloader机制以及scope配备??????<attribute?name="JTAService">jboss:service=TransactionManager</attribute>
jboss classloader机制以及scope配备??????<attribute?name="UserTransactionService">jboss:service=ClientUserTransaction</attribute>
jboss classloader机制以及scope配备??????<attribute?name="RMI_IIOPService">jboss:service=CorbaORB</attribute>
jboss classloader机制以及scope配备???</mbean>


???首先看一下各种类型的deployer。不同的deployer是根据文件的后缀进行区分。MainDeployer起到一个controller的作用,根据不用的后缀分发到不同的deployer进行处理。如果是*.ear,则会由EARDeployer进行载入。
应用的加载时一个 Top Level Deployer + Top Level Ucl。 举个例子,比如发布一个a.ear应用,ear应用中会包含一个*.war。这时候就会涉及deployer选择问题。jboss采取的原则就是按Top Level,根据最顶层的应用选择deployer,继而也有了top level ucl的概念。由顶级的ucl来加载整个应用。这里需要注意的是war的部署有点特别。它只是将自身添加到ucl的classpath域中,而war下的WEB-INF/lib/*.jar,则是由WebAppClassloader来加载。可调整ear下的 META-INF/jboss-service.xml中的UseJbossWebLoader属性。如果设置为true,故名思义就是用ucl来加载war下的jar包。否则就是采用独立的classloader加载。
?? 再看一下ucl的加载过程,首先会调用仓库去loadclass,仓库在查找无果的情况下会回调各自的UCL去加载本地库。
jboss classloader机制以及scope配备

3. jboss scope配置

<server>??
jboss classloader机制以及scope配备????<loader-repository>?com.example:loader=unique-archive-name?</loader-repository>??
jboss classloader机制以及scope配备</server>


????????
????针对.ear,你可以在jboss-app.xml添加如下配置:

????jboss classloader机制以及scope配备<jboss-app>??
jboss classloader机制以及scope配备??<loader-repository>com.example:loader=unique-archive-name</loader-repository>??
jboss classloader机制以及scope配备</jboss-app>

????
????针对 .war,你可以在jboss-web.xml添加如下配置:

????jboss classloader机制以及scope配备<jboss-web>
jboss classloader机制以及scope配备<class-loading?java2ClassLoadingCompliance='true'>??
jboss classloader机制以及scope配备???????<loader-repository>????
jboss classloader机制以及scope配备?????????????com.example:loader=unique-archive-name??
jboss classloader机制以及scope配备?????????????<loader-repository-config>??
jboss classloader机制以及scope配备?????????????????java2ParentDelegaton=true??
jboss classloader机制以及scope配备?????????????</loader-repository-config>??
jboss classloader机制以及scope配备??????</loader-repository>????
jboss classloader机制以及scope配备?</class-loading>
jboss classloader机制以及scope配备</jboss-web>

???
?? 注意,在最新的4.2.1版本中,<class-loading>标签已经不再使用,你可以直接配置:

jboss classloader机制以及scope配备<jboss-web>????
jboss classloader机制以及scope配备????<loader-repository>?com.example:loader=unique-archive-name?</loader-repository>????
jboss classloader机制以及scope配备</jboss-web>


????针对这两种方式的配置,4.0.5版本都支持。??
??????
????针对典型的ear+war应用,*.ear/META-INF/jboos-service.xml,用于调整war的加载方式。

?jboss classloader机制以及scope配备<!--?Get?the?flag?indicating?if?the?normal?Java2?parent?first?class???
jboss classloader机制以及scope配备???????????loading?model?should?be?used?over?the?servlet?2.3?web?container?first???
jboss classloader机制以及scope配备???????????model.???
jboss classloader机制以及scope配备??????-->??
jboss classloader机制以及scope配备??????<attribute?name="Java2ClassLoadingCompliance">false</attribute>??
jboss classloader机制以及scope配备??????<!--?A?flag?indicating?if?the?JBoss?Loader?should?be?used.?This?loader???
jboss classloader机制以及scope配备???????????uses?a?unified?class?loader?as?the?class?loader?rather?than?the?tomcat???
jboss classloader机制以及scope配备???????????specific?class?loader.???
jboss classloader机制以及scope配备???????????The?default?is?false?to?ensure?that?wars?have?isolated?class?loading???
jboss classloader机制以及scope配备???????????for?duplicate?jars?and?jsp?files.???
jboss classloader机制以及scope配备??????-->??
jboss classloader机制以及scope配备??????<attribute?name="UseJBossWebLoader">false</attribute>??
jboss classloader机制以及scope配备

????配置java2ClassLoadingCompliance为true,则表明是选择parent first。典型的classloader的双亲委托模型,否则是采用child first,先从自身加载,找不到再相父类请求。
????配置UseJBossWebLoader为false,则webapp的加载通过独立于jboss的classloader进行加载。

读书人网 >操作系统

热点推荐