JBoss的兩種類隔離機制配置說明
本文來自tiger888的博客,原文標題為《JBoss類隔離》。
這幾天,項目組在部署JBOSS時遇到不少問題,都是由于JBOSS的類裝載問題引起,特發表一篇BLOG詳細說一下JBOSS的類隔離機制。
在部署應用到JBoss服務器時,通常見到的問題就是應用所帶的jar包與容器自己的jar包版本不同導致的沖突,以及應用間jar包導致的沖突,JBOSS提供兩種隔離機制:
1. 部署包之間的隔離
2. 覆蓋JBoss Server的類的隔離
對于這兩種隔離,通常是修改部署文件來進行,以下進行說明:
部署包之間的隔離機制
對于.ear部署包,我們應該修改jboss-app.xml如下:
- <jboss-app>
- <loader-repository>
- com.example:archive=unique-archive-name
- </loader-repository>
- </jboss-app>
對于.war部署包,在jboss-web.xml中定義如下:
- <jboss-web>
- <class-loading>
- <loader-repository>
- com.example:archive=unique-archive-name
- </loader-repository>
- </class-loading>
- </jboss-web>
在JBoss 4.2.1中<class-loading>不再被支持,而4.0.5兩種方式都支持,直接修改為:
- <jboss-web>
- <loader-repository>
- com.example:archive=unique-archive-name
- </loader-repository>
- </jboss-web>
在.sar部署包中,在jboss-service.xml定義如下:
- <server>
- <loader-repository>
- com.example:archive=unique-archive-name
- </loader-repository>
- </server>
示例中,com.example:archive=unique-archive-name代表jar倉庫的對象名objectName ,其中,com.example可以隨意取,unique-archive-name 就用部署包的名字即可,例如com.example:archive=helloworld.sar,保證這一串唯一即可。而com.example將出現在JMX-Console (http://localhost:8080/jmx-console/)列出的節點上(每個節點為一個LoaderRepository domain:jar參考的域概念,其實就是一個所有jar容器倉庫的分組概念)
對于部署包內內嵌了其他部署包,只有最上層的部署描述配置才起作用,例如:
.ear中包含了.sar和.war,這只有.ear中的META-INF/jboss-app.xml 中定義的隔離范圍才會起作用。
.sar中包含了.war,則只有.sar META-INF/jboss-service.xml中定義的隔離范圍才起作用
覆蓋JBoss Server的類的隔離
對于jboss-app.xml:
- <jboss-app>
- <loader-repository>
- com.example:archive=unique-archive-name
- <loader-repository-config>
- java2ParentDelegation=false
- </loader-repository-config>
- </loader-repository>
- </jboss-app>
對于jboss-web.xml:
- <jboss-web>
- <class-loading java2ClassLoadingCompliance="false">
- <loader-repository>
- com.example:archive=unique-archive-name
- <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
- </loader-repository>
- </class-loading>
- ...
jboss-service.xml:
- <server>
- <loader-repository>
- com.example:archive=unique-archive-name
- <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
- </loader-repository>
- ...
#t#EAR or WAR的類將按照以下順序裝載:
1. WEB-INF/lib (for WARs)
2. server/default/lib下的jar包
3. tomcat的jar包server/default/deploy/jbossweb-tomcatxxx.sar,與server/default/lib將混合在一起,不區別順序。