1. 程式人生 > >從JBOSS啟動的問題談及JBOSS中jar的載入順序

從JBOSS啟動的問題談及JBOSS中jar的載入順序

JBOSS啟動的問題解決到CLASSLOADER在JBOSS的載入 


一,問題
最近使用JBOSS做WEB開發的容器,釋出本地的一個應用的時候,發現在日誌中總是報錯,此應用也啟動不起來,具體的日誌如下: 

E Java程式碼  收藏程式碼
  1. RROR context.ContextLoader - Context initialization failed  
  2. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [common/webx-root.xml]  
  3. 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;  
  4. Caused by:   
  5. 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;  
  6. Caused by:   
  7. 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程式碼  收藏程式碼
  1. 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包。

原文:http://scholers.iteye.com/blog/821402

相關推薦

Tomcat啟動載入資料到快取[web.xmllistener載入順序]

最近用到在Tomcat伺服器啟動時自動載入資料到快取,這就需要建立一個自定義的快取監聽器並實現ServletContextListener介面,並且在此自定義監聽器中需要用到Spring的依賴注入功能.在web.xml檔案中監聽器配置如下: <li

動態引入的外部 JS 檔案在各瀏覽器載入順序不一致問題解決

標準參考 無。 問題描述 頁面開發過程中,為了避免頁面載入時引入過多外部 JS 檔案,導致阻塞頁面內容下載及渲染的情況出現。將會採用頁面內容載入完成後,動態載入外部 JavaScript 檔案的方法來解決此類問題。但是,需要注意的是,常用動態插入外部指令碼檔案的方法在各瀏覽器中的執行順序

有關jsponclick事件無效的原因,以及jsp頁面載入順序的問題

今天在寫jsp頁面時遇到一個有關onclick事件無效的問題,在這裡分享一下: <body> <div> <input type="text" id="name"/> </div> <div id="hin

JavaScript—分析JavaScript在Html頁面載入順序

js程式碼執行順序比較的形象,使用者可以直觀的感受這種執行順序。但是,js程式碼的執行順序是比較複雜的。有時候我們會把js程式碼寫在html裡面,而html文件在瀏覽器中解析的過程是這樣:瀏覽器按照文件流從上到下逐步解析頁面結構和資訊。js程式碼作為嵌入的指令碼

$(function(){})與!function(){}()在頁面載入順序比較

大家都知道 $(function(){}); 是 $(document).ready(function(){}) 的簡寫,它是在頁面DOM載入完畢之後自動執行。 !function(){}(); 是一個匿名函式,而且類似這樣函式的寫法還有好多種,比

JBOSS啟動的問題談及JBOSSjar載入順序

JBOSS啟動的問題解決到CLASSLOADER在JBOSS的載入 一,問題最近使用JBOSS做WEB開發的容器,釋出本地的一個應用的時候,發現在日誌中總是報錯,此應用也啟動不起來,具體的日誌如下: E Java程式碼   RROR context.ContextL

Microsoft Office word powerpoint 刪除MathType載入項後每次啟動顯示載入錯誤

之前是一個前人說,LaTeX打公式可以很節省時間,而且X格很高,咦……,這麼好的裝X機會怎麼能錯過,果斷下載了版本為6的MathType,載入到word和PowerPoint中,用了一段時間,蠻可以的

一個jboss啟動shell腳本

class dict its rotation address close paul logs tin   腳本1: #!/bin/sh # [email protected]/* */ #JBOSS_HOME JBOSS_HOME="/opt/app/jb

springMVC項目部署 服務器啟動spring容器報錯bean未類加載器找到

png counter pcl lec 項目搭建 session IT fec leg bean未從類加載器中找到 警告: Exception encountered during context initialization - cancelling refresh at

web工程啟動時,在一個類延遲載入Bean,因為該Bean類可能還沒被JVM載入

   問題描述: (1)javaWeb專案啟動中,還沒啟動完成,在下面這個類載入另一個Bean類, (2)通過getBean方法獲取到該Bean,可以獲取到,不為null (3)但是,呼叫該Bean的方法insertSelective()方法,進不去該方法   &nb

【maven】排除mavenjar包依賴的解決過程 例子:spring cloud啟動zipkin,報錯maven依賴jar包衝突 Class path contains multiple SLF4J bindings.

一直對於maven中解決jar包依賴問題的解決方法糾結不清: 下面這個例子可以說明一個很簡單的解決方法:     專案啟動報錯: Connected to the target VM, address: '127.0.0.1:59412', transport: 'sock

java專案依賴的jar含有相同類時的載入順序(按照)

類被載入時,會先判斷類是否已經被載入。第二個相同類不被載入。可以在Java Build Path裡調整順序。 1 新建一個javaProject,並打包,如下圖:   2 新建第二個javaProject,並打包,其中的包名和類名及方法都和第一個project一致,只是輸出不同

[原始碼和文件分享]根據PE檔案格式匯入表獲取載入的DLL並遍歷匯入函式名稱和地址

背景 瞭解 PE 檔案格式,對於做一些資料分析都是比較重要的基礎。在 PE 檔案格式中,理解匯入表以及匯出表的工作原理,又是重中之重。理解了 PE 格式的匯入表,就可以修改 PE 格式進行 DLL 注入,也可以修改匯入表實現 API HOOK 等。理解了 PE 格式的匯出表,可以不需要 WIN3

intellij啟動jetty出現的類載入問題

背景 簡單來說,就是使用intellij啟動內嵌jetty的工程,爆出class not found exception,但是用eclipse啟動沒有問題,並且之前也是一直在eclipse中啟動,最近嚐鮮換成intellij才出現此問題。以下是具體配置

openstack:nova映象啟動(建立一個新卷)”建立虛擬機器的流程

原文網址:http://blog.csdn.net/xiangpingli/article/details/47912777 nova還有一種啟動方式:“從映象啟動(建立一個新卷)” 這個流程中,nova會在_prep_block_device中的attach_blo

jhipster生成的工程war包部署到tomcat,tomcat正常啟動,但一直不載入專案的問題原因。

jhipster生成工程打成war包,可以直接採用java -jar war包命令執行。 如果要將其放到tomcat下webapps中執行,如果tomcat啟動成功,也將war包解壓開,但就是不載入工程。此問題困擾很長時間,最終發現是jdk版本問題導致。 出現此問題,需要檢

eclipsetomcat載入專案啟動時無.class檔案

遇到個問題,專案新增到tomcat之後,tomcat執行發現幾秒就啟動了,且呼叫api介面總是404,服務找不到,排查問題, 1.查詢tomcat服務載入路徑 2.進入tomcat的webapps裡面的專案檢視,發現一個.class檔案都沒有 3.檢視 Buil

Openstack:Nova雲硬碟啟動”、“映象啟動”、“映象啟動(建立一個卷)”_prep_block_device的差異

原文網址:http://blog.csdn.net/xiangpingli/article/details/47913059 在前面跟蹤分析了:“從映象啟動”、“從映象啟動(建立一個新卷)”過程中,卷的建立是在_build_resources->_prep_blo

java web專案classes資料夾下的class和WEB-INF/libjar裡的class檔案載入順序

如果是釋出到weblogic的話,可以在WebContent\WEB-INF\weblogic.xml裡面配置。 參考配置如下: <?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://www.b

JBoss啟動常見的錯誤

1.報錯:java.rmi.server.ExportException: Port already in use: 1098; nested exception is:          java.net.BindException: Address already i