http://blog.163.com/javaee_chen/blog/static/17919507720116149511489/将一个完整的.war包部署到Jboss容器中,启动后报如下错误:

15:04:48,632 ERROR [ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map;
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
分析情况:
在jboss根目录下执行如下命令
$find . -name slf4j*.jar                      
./bin/configuration/org.eclipse.osgi/bundles/24/1/.cp/slf4j-log4j12-1.4.3.jar
./bin/configuration/org.eclipse.osgi/bundles/24/1/.cp/slf4j-api-1.4.3.jar
./server/default/deploy/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-log4j12-1.4.3.jar
./server/default/deploy/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-api-1.4.3.jar
./server/default/deploy/etl_sngps.war/WEB-INF/lib/slf4j-api-1.6.1.jar
./server/default/deploy/etl_sngps.war/WEB-INF/lib/slf4j-log4j12-1.6.1.jar
./server/default/deploy/jboss-web.deployer/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-log4j12-1.4.3.jar
./server/default/deploy/jboss-web.deployer/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-api-1.4.3.jar
明明项目中lib地下的是1.6版本的,为什么还提示java.lang.NoSuchMethodError: org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map;(注:1.4一下版本会报这个错误,因为其不存在这里面的某个方法)
 
查看Jboss jar加载文档:
1)        org.jboss.Main.main(String[]) 为入口. 
2)        main 函数创建一个名叫”jboss”的线程组, 然后创建一个属于该组的线程, 在线程中执行boot方法. 
3)        boot 方法首先处理main函数中的参数(及一些其它的系统环境设置), 接着就用系统的属性创建了org.jboss.system.server.ServerLoader实例[new ServerLoader(props)]. 
4)        ServerLoader 注册Jboss相关的类路径, 包括XML解析器, jboss-jmx.jar, concurrent.jar及其它的一些额外的类路径. 
这里一般都是在JBOSS_HOME\lib下面的jar. 
5)        ServerLoader 通过load(ClassLoader)方法创建Jboss Server实例. 参数ClassLoader是ClassLoader parentCL = Thread.currentThread(). getContextClassLoader( )得到的当前线程的类加载器. 创建的Server实例是org.jboss.system.server.Server接口的实现. load(ClassLoader)方法的细节: 
?  用jar包及在ServerLoader中注册的类路径创建一个URLClassLoader的实例, 把传入的ClassLoader作为该URLClassLoader的parent. 
?  Server 接口的实现类由系统属性 jboss.server.type决定, 默认是 org.jboss.system.server.ServerImpl. 
?  URLClassLoader 通过无参构造函数加载Server接口实现的实例. 在加载前把当前线程的类加载器置为该URLClassLoader, 在加载完成后再置回之前传入的ClassLoader. 
 
6)        Server 实例用系统属性进行初始化[server.init(props)]. 
7)        服务起动[server.start()]. 起动过程的默认实现如下: 
?  把当前线程类型加载器置为加载该Server接口实现实例的ClassLoader. 
?  在jboss域内, 通过MBeanServerFactory的createMBeanServer(String)方法创建MbeanServer实例. 
?  在MBean Server上注册ServerImpl和ServerConfigImpl两个MBean. 
?  初始化统一的类加载仓库(unified class loader repository), 用来装载服务器配置目录及其它可选目录下的jar文件. 对于每一个jar文件和类目录都会创建一个相应的org.jboss.jmx.loading.UnifiedClassLoader实例, 并且注册到统一的仓库中. 其中一个UnifiedClassLoader实例会被设置为当前线程上下文的ClassLoader. [?: This effectively makes allUnifiedClassLoaders available through the thread context class loader.] 
?  接下来创建org.jboss.system.ServiceController的MBean实例. ServiceController管理JBoss MBean服务的生命周期. 
 
需要注意的是:JBOSS在加载自带的核心JAR之后,将会优先加载下面的两个目录 
1、D:\jboss\server\default\lib 
2、D:\jboss\server\default\tmp\deploy 
 
但是上面三组均不在以上1 2 所指的2个目录中。接着看......
找到如下文件,注意这个文件里面蕴藏着jar加载的有一个规则.
\jboss-4.2.3.GA\server\default\conf\xmdesc org.jboss.deployment.MainDeployer-xmbean.xml
最先加载的是后缀名为deployer目录下应用或者服务;
250:.rar,300:-ds.xml,400:.jar,500:.war,550:.jse,650:.ear,800:.bsh
<descriptors>
         <value value="250:.rar,300:-ds.xml,400:.jar,500:.war,550:.jse,650:.ear,800:.bsh"/>
</descriptors>
可以通过调整这个value来改变加载规则。
 
这里已经很清楚了,上面所引爆的问题,正是由于/jboss-web.deployer下面所用的1,4版本导致的。删除后,一切正常。
这里面还有一个问题,有些时候我们在使用jboss容器前,应该认真的看下jboss目录的机构及大致各个目录的作用,然后做一些精简删除无用的或者无关精要的目录,不仅可以让jboss瘦身还能减少问题引发的根源。

JBoss jar包冲突及jar加载顺序的更多相关文章

  1. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

    如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...

  2. tomcat的添加及jar包和jQuery的加载

  3. jar类库加载顺序

    当我们启动一个tomcat的服务的时候,jar包和claess文件加载顺序: 1. $java_home/lib 目录下的java核心api 2. $java_home/lib/ext 目录下的jav ...

  4. 重新看待Jar包冲突问题及解决方案

    Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除.依赖管理 ...

  5. 【BUG】websphere找不到类或jar包冲突

    来自:http://liuwei1578.blog.163.com/blog/static/49580364200991572642653/ Jar包冲突问题是在大型Java软件开发中经常遇到的问题, ...

  6. maven引入jar包冲突问题

    1.原因 使用maven过程中,经常会遇到jar包重复加载或者jar包冲突的问题,但是有些jar包是由于maven加载了其他jar包自动引入的,并非自己主动添加的,导致和自己添加的jar包版本冲突 举 ...

  7. tomcat jar包加载顺序

    加载顺序: 1. $java_home/lib 目录下的java核心api 2. $java_home/lib/ext 目录下的java扩展jar包 3. java -classpath/-Djava ...

  8. 为什么项目的jar包会和tomcat的jar包冲突?

    为什么项目的jar包会和tomcat的jar包冲突? 碰到这个问题,猜测tomcat启动时会将自己的lib和项目的lib在逻辑上归并为一个大的lib,但是并没有做版本区分以及去重,这样相同的包可能就有 ...

  9. weblogic与axis2 jar包冲突

    1.org.springframework.web.util.NestedServletException: Handler processing failed; nested exception i ...

随机推荐

  1. 【动态规划】Round Subset

    CF837D. Round Subset Let's call the roundness of the number the number of zeros to which it ends. Yo ...

  2. 【BFS】Tester Program

    [poj1024]Tester Program Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2760   Accepted ...

  3. BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3022 [题目大意] 给定n个球员,第i个球员年龄为AGEi,水平为SKILLi. 没有 ...

  4. 【枚举】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem G. Equation

    f(n)定义为n的十进制表示下所有位的平方和. 问你方程K*f(n)=n在a<=n<=b中的解的个数. 发现f(n)最大不超过2000,可以直接枚举f(n),然后判断K*f(n)的位的平方 ...

  5. 【搜索】【约数个数定理】[HAOI2007]反素数ant

    对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数. 所以,n以内的反质数即为不超过n的 ...

  6. 【SAM】POJ1509-Glass Beads

    [题目大意] 求一个循环数列的最小表示法. [思路] 把原创复制一遍放在后面,建立SAM,从s按字典序开始跑长度L即可. 板子来源(作者见连接内):

  7. hibernate双向ManyToMany映射

    工作需要一个双向多对多映射,照着李刚的书做了映射,碰到了一些问题,现就问题及解决方案进行总结归纳. 1.首先奉上最初代码 Person5.java @Entity @Table(name = &quo ...

  8. JDK源码学习笔记——Iterable/Iterator实现原理

    Collection接口继承java.lang.Iterable接口,集合类重写了iterator()方法 public interface Iterable<T> { Iterator& ...

  9. #iOS问题记录# UIWebView滑动到底部

    最近看Tmall的iOS APP,在Tmall的商品简介页面,当拖动到最底部时,会提示继续向上拖动,“查看图文详情”: 觉得这个设计挺好的.闲来无事,自己UIWebView模仿一下,问题是检查UIWe ...

  10. OpenVPN设置客户端固定IP

    在使用openvpn的过程中,多台客户端连接上同一台openvpn服务器之后,客户端的的IP地扯经常变动,导致客户端之间无法正常通讯,openvpn的版本变动也导致了固定IP地扯的配置不同,用以下方法 ...