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及其它的一些額外的類路徑.
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服務的生命周期.
- org.jboss.deployment.MainDeployer 執行個體被建立并起動. MainDeployer管理部署的依賴和部署的定向.
- org.jboss.deployment. JARDeployer 執行個體被建立并起動. JARDeployer處理jar包的部署.
- org.jboss.deployment. SARDeployer 執行個體被建立并起動. SARDeployer處理JBoss MBean服務的部署.
- MainDeployer 對目前伺服器檔案環境裡conf/jboss-service.xml定義的服務進行部署.
- 啟動過程結束. 把目前線程上下文類加載器置回為起動前的ClassLoader.