1、catalina.home的设置
2、创建createStartDigester,digester是XML到对象的一个解析组件,详情可见apache。
重要特点是生成的对象从属性的延展性来看,是树形,这与XML在形式上是一致的。
所以要设置根结点对象,这里的根结点对象就是Catalina实例。
默认的配置文件就是conf/server.xml。估且称之为是一个映射的过程。
protected Digester createStartDigester() {long t1=System.currentTimeMillis();// Initialize the digesterDigester digester = new Digester();digester.setValidating(false);digester.setRulesValidation(true);HashMap<Class<?>, List<String>> fakeAttributes =new HashMap<Class<?>, List<String>>();ArrayList<String> attrs = new ArrayList<String>();attrs.add("className");fakeAttributes.put(Object.class, attrs);digester.setFakeAttributes(fakeAttributes);digester.setClassLoader(StandardServer.class.getClassLoader());// Configure the actions we will be usingdigester.addObjectCreate("Server","org.apache.catalina.core.StandardServer","className");digester.addSetProperties("Server");digester.addSetNext("Server","setServer","org.apache.catalina.Server");digester.addObjectCreate("Server/GlobalNamingResources","org.apache.catalina.deploy.NamingResources");digester.addSetProperties("Server/GlobalNamingResources");digester.addSetNext("Server/GlobalNamingResources","setGlobalNamingResources","org.apache.catalina.deploy.NamingResources");digester.addObjectCreate("Server/Listener",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Listener");digester.addSetNext("Server/Listener","addLifecycleListener","org.apache.catalina.LifecycleListener");digester.addObjectCreate("Server/Service","org.apache.catalina.core.StandardService","className");digester.addSetProperties("Server/Service");digester.addSetNext("Server/Service","addService","org.apache.catalina.Service");digester.addObjectCreate("Server/Service/Listener",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Service/Listener");digester.addSetNext("Server/Service/Listener","addLifecycleListener","org.apache.catalina.LifecycleListener");//Executordigester.addObjectCreate("Server/Service/Executor","org.apache.catalina.core.StandardThreadExecutor","className");digester.addSetProperties("Server/Service/Executor");digester.addSetNext("Server/Service/Executor","addExecutor","org.apache.catalina.Executor");digester.addRule("Server/Service/Connector",new ConnectorCreateRule());digester.addRule("Server/Service/Connector",new SetAllPropertiesRule(new String[]{"executor"}));digester.addSetNext("Server/Service/Connector","addConnector","org.apache.catalina.connector.Connector");digester.addObjectCreate("Server/Service/Connector/Listener",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Service/Connector/Listener");digester.addSetNext("Server/Service/Connector/Listener","addLifecycleListener","org.apache.catalina.LifecycleListener");// Add RuleSets for nested elementsdigester.addRuleSet(new NamingRuleSet("Server/GlobalNamingResources/"));digester.addRuleSet(new EngineRuleSet("Server/Service/"));digester.addRuleSet(new HostRuleSet("Server/Service/Engine/"));digester.addRuleSet(new ContextRuleSet("Server/Service/Engine/Host/"));addClusterRuleSet(digester, "Server/Service/Engine/Host/Cluster/");digester.addRuleSet(new NamingRuleSet("Server/Service/Engine/Host/Context/"));// When the 'engine' is found, set the parentClassLoader.digester.addRule("Server/Service/Engine",new SetParentClassLoaderRule(parentClassLoader));addClusterRuleSet(digester, "Server/Service/Engine/Cluster/");long t2=System.currentTimeMillis();if (log.isDebugEnabled()) {log.debug("Digester for server.xml created " + ( t2-t1 ));}return (digester);}
3、设置根结点元素,并映射。
digester.push(this);
digester.parse(inputSource);
4、启动server,默认实现类是StandardServer.
// Start the new servertry {getServer().init();} catch (LifecycleException e) {if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) {throw new java.lang.Error(e);} else {log.error("Catalina.start", e);}}
这一步实际上完成的工作极多,包括一些状态的转换(tomcat中很多类具有生命周期的概念),包括Service、Connector等的初始化。