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

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

  • 部署包之间的隔离
  • 覆盖JBoss Server的类的隔离

对于这两种隔离,通常是修改部署文件来进行,以下进行说明:

部署包之间的隔离机制

  • 对于.ear部署包,我们应该修改jboss-app.xml如下:

    Xml代码  
    1. <jboss-app>
    2. <loader-repository>
    3. com.example:archive=unique-archive-name
    4. </loader-repository>
    5. </jboss-app>
  • 对于.war部署包,在jboss-web.xml中定义如下:
    Xml代码  
    1. <jboss-web>
    2. <class-loading>
    3. <loader-repository>
    4. com.example:archive=unique-archive-name
    5. </loader-repository>
    6. </class-loading>
    7. </jboss-web>
  • 在JBoss 4.2.1中<class-loading>不再被支持,而4.0.5两种方式都支持,直接修改为:
    Xml代码  
    1. <jboss-web>
    2. <loader-repository>
    3. com.example:archive=unique-archive-name
    4. </loader-repository>
    5. </jboss-web>
  • 在.sar部署包中,在jboss-service.xml定义如下:
    Xml代码  
    1. <server>
    2. <loader-repository>
    3. com.example:archive=unique-archive-name
    4. </loader-repository>
    5. </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:

    Xml代码  
    1. <jboss-app>
    2. <loader-repository>
    3. com.example:archive=unique-archive-name
    4. <loader-repository-config>
    5. java2ParentDelegation=false
    6. </loader-repository-config>
    7. </loader-repository>
    8. </jboss-app>
  • 对于jboss-web.xml:
    Xml代码  
    1. <jboss-web>
    2. <class-loading java2ClassLoadingCompliance="false">
    3. <loader-repository>
    4. com.example:archive=unique-archive-name
    5. <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
    6. </loader-repository>
    7. </class-loading>
    8. ...
  • jboss-service.xml:
    Xml代码  
    1. <server>
    2. <loader-repository>
    3. com.example:archive=unique-archive-name
    4. <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
    5. </loader-repository>
    6. ...

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将混合在一起,不区别顺序。 
 
 
 
更多文章:

JBoss类隔离的更多相关文章

  1. tomcat 是如何做到不同webapp 类隔离的

    这个问题的核心是classloader 上图中 启动类加载器,扩展类加载器,应用程序类加载器是 jvm 自带的类加载器. comm  catalina  shared webapp 是tomcat 扩 ...

  2. ThreadLocal工具类 隔离思想

    ThreadLocal不是用来解决共享对象的多线程访问问题的, 通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象, ...

  3. InnoDB事务隔离级别

    转载于:http://blog.csdn.net/wudongxu/article/details/8623610 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的 ...

  4. 1031MySQL事务隔离级别详解

    转自http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支 ...

  5. 《高性能MySQL》读书笔记--锁、事务、隔离级别 转

    1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进 ...

  6. MySQL事务隔离级别详解

    原文地址:http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级 ...

  7. 关于SWT中的表格(TableViewer类)

    JFace是SWT的扩展.它提供了一组功能强大的界面组件.其中包含表格,树,列表.对话框,向导对话框等. 表格是一种在软件系统中很常用的数据表现形式.特别是基于数据库的应用系统.表格更是不可缺少的界面 ...

  8. 转:修改类不重启tomcat 自动加载项目

    可以修改类不用重启Tomcat加载整个项目(手工启动)     配置reloadable=true(自动重载)     使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) (rel ...

  9. 高性能MySql学习笔记——锁、事务、隔离级别(转)

    为什么需要锁? 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对Table1.rown进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作 ...

随机推荐

  1. 【构造】Ural Championship April 30, 2017 Problem K. King’s island

    题意:让你构造一个n个点的简单多边形,使得所有点是整点,并且所有边长是整数,并且没有边平行于坐标轴. 就利用勾股数,如下图这样构造即可,n为偶数时,只需矩形拼成,n为奇数时,封上虚线边即可. #inc ...

  2. 【矩阵乘法】Gym - 101412C - One-Dimensional Cellular Automaton

    给你一个一维细胞自动机,第i个格子在时刻t的状态是这样获得的,问你t时刻的状态. 把0时刻的状态视作一个列向量,发现状态转移其实是一个n*n的矩阵(以n=5为例), B C       A B C   ...

  3. 【最大流Dinic模板】HDU1532&POJ1273-Drainage Ditches(16/3/6更正)

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  4. andorid关于selector更换图片失效

    写selector的xml文件时,需注意item的顺序,不带状态的item放在最后,否则selector无效 为按钮写了一个selector,一个正常状态,一个点击的状态,用了两张不同的图片.以求达到 ...

  5. mysql原创博客

    http://blog.itpub.net/15480802/viewspace-1755100/

  6. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  7. Linux(CentOS)下squid代理服务器配置-五岳之巅

    squid是linux下的一款代理服务器软件,他可以共享网络 ,加快访问速度,节约通信带宽,同时防止内部主机受到攻击,限制用户访问,完善网络管理 rpm -qa|grep squidyum insta ...

  8. andriod获得textView的值设置textView的text

    TextView pTextView=(TextView)findViewById(R.id.textView2);String str=pTextView.getText().toString(); ...

  9. android源码包下载

    http://rgruet.free.fr/public/ 其他下载地址:http://cid-b50f9d5897331c44.office.live.com/browse.aspx/Android ...

  10. python笔记12-python多线程之事件(Event)

    前言 小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现 Event(事件) Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果 ...