本文來自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>
- ...
1. WEB-INF/lib (for WARs)
2. server/default/lib下的jar包
3. tomcat的jar包server/default/deploy/jbossweb-tomcatxxx.sar,與server/default/lib將混合在一起,不區別順序。