JBoss AS 6.1.0 Final bootstrap.xml的解析过程

时间:2021-06-06 04:20:19


JBoss 启动文件 jboss-6.1.0.Final/server/default/conf/bootstrap.xml 是加载服务内容的入口。


在 JBoss 初始化操作的最后一个步骤中 , AbstractJBossASServerBase    setupBootstrapDescriptorsFromBootstrapUrl()方法中,完成了对 bootstrap.xml的解析。

过程如下:


      protected void setupBootstrapDescriptorsFromBootstrapUrl()   {
 
      final URL bootstrapUrl = this.getConfiguration().getBootstrapUrl();
      // bootstrapUrl = E:/jboss-6.1.0.Final/server/default/conf/bootstrap.xml


      if (bootstrapUrl == null)  {
         throw new IllegalStateException("Bootstrap URL should have been initialized");
      }
      final BootstrapMetaData bmd = BootstrapParser.parse(bootstrapUrl);
      final List<String> urlStrings = bmd.getBootstrapURLs();


      ...
    }


 public class BootstrapParser{   public static BootstrapMetaData parse(URL url)   {      if (url == null)         throw new IllegalArgumentException("Null url");      UnmarshallerFactory factory = UnmarshallerFactory.newInstance();      Unmarshaller unmarshaller = factory.newUnmarshaller();      try {         BootstrapMetaData result = (BootstrapMetaData) unmarshaller.unmarshal(url.toString(),               new BootstrapSchemaBinding());         if (result == null)            throw new IllegalStateException("The bootsrap xml " + url + " is not well formed");         return result;      }      catch (Exception e) {         throw new RuntimeException("Error unmarshalling " + url, e);      }   }}  


    public static BootstrapMetaData parse(URL url){      if (url == null)         throw new IllegalArgumentException("Null url");      UnmarshallerFactory factory = UnmarshallerFactory.newInstance();      Unmarshaller unmarshaller = factory.newUnmarshaller();      try{         BootstrapMetaData result = (BootstrapMetaData) unmarshaller.unmarshal(url.toString(),               new BootstrapSchemaBinding());         if (result == null)            throw new IllegalStateException("The bootsrap xml " + url + " is not well formed");         return result;      }      catch (Exception e) {         throw new RuntimeException("Error unmarshalling " + url, e);      }   }  


 class BootstrapSchemaBinding extends SchemaBinding{   public static final String NAMESPACE = "urn:jboss:bootstrap:1.0";   public BootstrapSchemaBinding(){      TypeBinding stringType = getType(SimpleTypeBindings.typeQName(String.class));      setNamespaces(Collections.singleton(NAMESPACE));      setIgnoreLowLine(true);      setIgnoreUnresolvedFieldOrClass(false);      setReplacePropertyRefs(true);      setStrictSchema(true);      TypeBinding bootstrapType = new TypeBinding(new QName(NAMESPACE, "bootstrapType"));      bootstrapType.setSimple(false);      AllBinding bootstrapModel = new AllBinding(this);      ParticleBinding bootstrapParticle = new ParticleBinding(bootstrapModel, 1, 1, false);      bootstrapType.setParticle(bootstrapParticle);      ClassMetaData bootstrapClassMetaData = new ClassMetaData();      bootstrapClassMetaData.setImpl(BootstrapMetaData.class.getName());      bootstrapType.setClassMetaData(bootstrapClassMetaData);      ElementBinding urlElement = new ElementBinding(this, new QName(NAMESPACE, "url"), stringType);      ParticleBinding urlParticle = new ParticleBinding(urlElement, 0, 1, true);      bootstrapModel.addParticle(urlParticle);      bootstrapType.pushInterceptor(urlElement.getQName(), new DefaultElementInterceptor() {         public void add(Object parent, Object child, QName name) {            BootstrapMetaData bootstrap = (BootstrapMetaData) parent;            String url = (String) child;            List<String> bootstrapURLs = bootstrap.getBootstrapURLs();            if (bootstrapURLs == null) {               bootstrapURLs = new ArrayList<String>();               bootstrap.setBootstrapURLs(bootstrapURLs);            }            bootstrapURLs.add(url);         }      });      addElement(new ElementBinding(this, new QName(NAMESPACE, "bootstrap"), bootstrapType));   }} 

解析之后,将bootstrap.xml中的内容保存到 server.getConfiguration() 对象中。


bootstrap.xml文件内容

 <?xml version="1.0" encoding="UTF-8"?><!--   The list of URLs for mc beans to load during bootstrap.   $Id: bootstrap.xml 106395 2010-07-02 02:16:59Z mmoyses $--><bootstrap xmlns="urn:jboss:bootstrap:1.0">   <url>bootstrap/classloader.xml</url>   <url>bootstrap/stdio.xml</url>   <url>bootstrap/kernel.xml</url>   <url>bootstrap/aop.xml</url>   <url>bootstrap/jmx.xml</url>   <url>bootstrap/deployers.xml</url>   <url>bootstrap/profile.xml</url>   <url>bootstrap/security.xml</url></bootstrap> 

与bootstrap.xml对应的解析类为   BootstrapMetaData;


解析完成后,下一步对这几个部分进行分别解析和加载。

确切的说,bootstrap中包含的 8 个配置文件,就是 微容器 Microcontainer 。


JBoss 服务初始化完成之后,服务的配置信息如下:

=======================

Server Configuration:


JBOSS_HOME URL: file:/E:/jboss-6.1.0.Final/
Bootstrap: $JBOSS_HOME\server/default/conf/bootstrap.xml
Common Base: $JBOSS_HOME\common/
Common Library: $JBOSS_HOME\common/lib/
Server Name: default
Server Base: $JBOSS_HOME\server/
Server Library: $JBOSS_HOME\server/default/lib/
Server Config: $JBOSS_HOME\server/default/conf/
Server Home: $JBOSS_HOME\server/default/
Server Data: $JBOSS_HOME\server/default/data/
Server Log: $JBOSS_HOME\server/default/log/
Server Temp: $JBOSS_HOME\server/default/tmp/