JBOSS启动的问题解决到CLASSLOADER在JBOSS的载入
一,问题
最近使用JBOSS做WEB开发的容器,发布本地的一个应用的时候,发现在日志中总是报错,此应用也启动不起来,具体的日志如下:
E
RROR context.ContextLoader - Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [common/webx-root.xml]
Offending resource: ServletContext resource [/WEB-INF/webx.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/common/webx-root.xml]; nested exception is java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionAttributes(Lorg/w3c/dom/Element;Ljava/lang/String;Lorg/springframework/beans/factory/config/BeanDefinition;Lorg/springframework/beans/factory/support/AbstractBeanDefinition;)Lorg/springframework/beans/factory/support/AbstractBeanDefinition;
Caused by:
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/common/webx-root.xml]; nested exception is java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionAttributes(Lorg/w3c/dom/Element;Ljava/lang/String;Lorg/springframework/beans/factory/config/BeanDefinition;Lorg/springframework/beans/factory/support/AbstractBeanDefinition;)Lorg/springframework/beans/factory/support/AbstractBeanDefinition;
Caused by:
java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionAttributes(Lorg/w3c/dom/Element;Ljava/lang/String;Lorg/springframework/beans/factory/config/BeanDefinition;Lorg/springframework/beans/factory/support/AbstractBeanDefinition;)Lorg/springframework/beans/factory/support/AbstractBeanDefinition;
一层层的看日志信息:
直接的错误信息是说不能加载相关的bean对象,然后继续看,为什么呢?说是在加载webx-root.xml的时候出错,然后继续看:
说是:
java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionAttributes(Lorg/w3c/dom/Element;Ljava/lang/String;Lorg/springframework/beans/factory/config/BeanDefinition;Lorg/springframework/beans/factory/support/AbstractBeanDefinition;)Lorg/springframework/beans/factory/support/AbstractBeanDefinition;
这段呢,说是没有这样的方法:parseBeanDefinitionAttributes,这个可是SPRING里面的啊,然后去网上搜索了一下,大致得到的结论有:
1.是配置文件错误---仔细分析日志就知道,不是这样的。
因为一直对JBOSS不是很熟悉,以前用TOMCAT做开发比较多,所以开始就没有想到部署的包有问题。因为同样的war包在别的地方是OK的。
说明还是我这里的问题。
2.继续查找,还是回头来仔细分析日志,发现最终还是spring报的错误,联想到这个具体的信息,猜测可能是spring的包出问题了。
可是应用里面的包都是OK的啊?那肯定是我环境的问题了。
原因:
然后去研究JBOSS的目录,发现JBOSS每次发布的时候都会生成一些临时文件到\server\default\tmp\deploy下面去,每次我发布的时候也都清除一下。
会不会是缓存出了问题?仔细查找这个临时目录下的文件,发现发布之后,生成了一个tmp3853123996149741254spring-2.0.7.jar的文件,而我确认我的应用需要的SPRING的版本是2.5.6,到这里终于恍然大悟:发布之后我的应用采用的是这个2.0.7的spring包,而不是我的应用WEB-INF\lib下面的。
那这个包是哪里生成的?仔细查找,发现在\server\default\deploy\jboss-spring-jdk5.deployer目录下就有一个。
而JBOSS的机制就是,发布的时候将\server\default\deploy下面的一些基础的应用一起发布,而这些基础应用里面包括上面的spring发布在temp的临时目录下,是作为所有应用的基础包,也就是说这些包的优先级要高于每个普通应用的包的。
解决的方法也很简单:
替换掉\server\default\deploy\jboss-spring-jdk5.deployer目录下的spring-2.0.7.jar为新的spring-2.5.6.jar即可。
注:我用的JBOSS版本是4.2.2GA.
二,JBOSS的加载机制
下面就来简单讲解一下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是发布某个WAR,EAR,EJB等应用之后生成的临时的jar,这些应用的所有JAR会生成诸如temp*.jar的形式。本文开头提到的错误也就是在目录1中存在一个spring.jar的包,优先于各个应用的spring.jar包。
分享到:
相关推荐
在运维过程中,了解JBoss的启动顺序以及其占用的端口对于调试、监控和优化系统性能至关重要。 **JBoss启动顺序** JBoss的启动过程大致分为以下几个阶段: 1. **环境准备**:首先,JBoss会检查运行环境,包括Java...
在本文中,我们将深入探讨JBoss的启动过程及其相关知识点。 1. **JBoss目录结构**: JBoss的安装目录包含多个子目录,如`bin`、`server`、`deploy`等。`bin`目录下有启动和停止服务器的脚本,`server`目录则包含了...
在实际应用中,通常需要将这些jar包添加到项目的类路径中,或者在JBoss的lib目录下,以确保它们在应用启动时被正确加载。 在开发过程中,为了确保最佳的兼容性和性能,开发者还应该注意以下几点: 1. 确保使用的...
这个压缩包包含的四个jar文件分别是JBoss在不同模块中的核心库,下面将详细解释每个文件的主要功能和在JBoss中的作用。 1. **jboss-jmx.jar**: JMX(Java Management Extensions)是Java平台的标准管理框架,用于...
标题提及的"解决jboss中启动的优先级的问题"是针对JBoss服务器如何确保特定应用或服务在其他依赖项启动后才启动的技术细节。 首先,我们需要理解JBoss中的部署模型。JBoss作为一款开源的应用服务器,它遵循Java EE...
当应用程序部署到JBoss上时,如果依赖的jar包与服务器中已存在的版本冲突或未被正确包含,就会导致应用无法正常启动或者功能缺失。 1. **问题分析**: - **依赖冲突**:可能是由于你的应用中包含了某个特定版本的...
总之,替换JBoss中的jar包是为了提升日志管理和通知功能,尤其是通过电子邮件发送日志,这在故障排查和系统监控中具有很高的价值。理解每个jar包的作用和配置过程,对于有效利用这一特性至关重要。
在服务管理器中,启动"JBossService"。如果一切配置正确,JBoss将作为Windows服务运行。 总结: 通过以上步骤,我们成功地将JBoss配置为Windows系统服务,实现了后台自动启动。这种方式不仅方便了日常运维,还可以...
3. **启用自动启动**:如果jar包没有自动启动,可以在部署目录下创建一个与其同名的`.deployment`文件,使JBOSS在启动时识别并加载该应用,例如: ``` echo. > %JBOSS_HOME%\standalone\deployments\myapp.jar....
jboss-ejb3-client.jar
在实际使用中,`jboss-common.jar`通常与其他JBoss相关的JAR包一起被引入到项目中,如`jboss-system.jar`、`jboss-jmx.jar`等,它们共同构成了JBoss服务器的基础架构。同时,`jboss-LICENSE.txt`文件则记录了该软件...
在JBoss中,JGroup可能被用作集群通信的基础,确保各个节点之间的同步和数据一致性。 结合这些技术,"jboss jdbc json jgroup.jar"可能是JBoss应用服务器中的一个组件或库,它集成了JDBC、JSON和JGroup的功能。这个...
【描述】"jboss-annotations-ejb3.jar" 提供给需要使用它的开发者,暗示了它可能是一个可下载的资源,用于集成到开发环境中。"自己取"意味着用户需要自行下载并按照需求添加到项目中,这通常适用于开发人员进行...
jboss-backport-concurrent.jar jboss-backport-concurrent.jar
在本文中,我们将深入探讨JBoss Logging 3.1.0.GA.jar的核心特性、用法以及其在实际项目中的应用。 首先,JBoss Logging是基于Java的日志API,它允许开发者使用统一的接口来实现多种日志框架的互换,如Log4j、Java ...
这个压缩包文件"jboss-logging-3.0.0.ga.jar"是JBoss的logging组件,它是JBoss框架中用于日志记录的重要模块。JBoss Logging 提供了一种灵活的日志解决方案,它支持多种日志实现,如Log4j、Java Util Logging 和 ...
JBOSS-J2EE.JAR JBOSS-J2EE.JAR JBOSS-J2EE.JAR JBOSS-J2EE.JAR JBOSS-J2EE.JAR JBOSS-J2EE.JAR
jboss-logging.jar
赠送jar包:jboss-logging-3.4.1.Final.jar; 赠送原API文档:jboss-logging-3.4.1.Final-javadoc.jar; 赠送源代码:jboss-logging-3.4.1.Final-sources.jar; 赠送Maven依赖信息文件:jboss-logging-3.4.1.Final....
在描述中提到的`jboss-logging.jar`和`jboss-logging-annotations.jar`则是JBoss组织提供的日志服务。`jboss-logging.jar`是一个高效的、可扩展的日志框架,支持多种日志实现,如Log4j、Java.util.logging和SLF4J。...