`

JBoss类隔离

阅读更多

这几天,项目组在部署JBOSS时遇到不少问题,都是由于JBOSS的类装载问题引起,特发表一篇BLOG详细说一下JBOSS的类隔离机制。

 

在部署应用到JBoss服务器时,通常见到的问题就是应用所带的jar包与容器自己的jar包版本不同导致的冲突,以及应用间jar包导致的冲突,JBOSS提供两种隔离机制:

  • 部署包之间的隔离
  • 覆盖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>
     ...
    
     

 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将混合在一起,不区别顺序。 
0
0
分享到:
评论

相关推荐

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    JBOSS tomcat resin jetty 容灾 日志框架 开源框架 slf4j 框架实现 log4j logback commong logging jdk logger 测试框架 测试框架 junit easymock testng mockito bug管理 禅道 jira 开发...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.4.2 把Customer持久化类映射到CUSTOMERS表  3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  ...

    Hibernate实战(第2版 中文高清版)

     10.2.3 获得额外的隔离性保证   10.3 非事务数据访问   10.3.1 揭开自动提交的神秘面纱   10.3.2 使用Hibernate非事务地工作   10.3.3 使用JTA的可选事务   10.4 小结   第11章 实现对话   11.1 ...

    ssh(structs,spring,hibernate)框架中的上传下载

    系统Web层将来切换到另一种实现技术的可能性也微乎其微,所以笔者觉得没有必要为了这个业务层完全独立于调用层的过高目标而去搞一个额外的隔离层,浪费了原材料不说,还将系统搞得过于复杂,相比于其它原则,"简单...

    Docker-Workshop

    系统上的工具更少(Tomcat,Jboss,MySql等)-仅需要docker 可测试的几个工具版本(Python轻)-&gt;隔离的主机和容器 没有42页的安装说明 管理边车 其他用例 只需按一下按钮,即可完成CI / CD管道,请参阅: 詹金斯...

Global site tag (gtag.js) - Google Analytics