`
wu_quanyin
  • 浏览: 208121 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Tomcat源码---容器启动六(3)

阅读更多

一,容器已经启动到部暑文件(webapps),接下去是StandardContext,standardWarpper还有Connector等的启动

我们来了解一下部暑war文件

 

   // Deploy WARs, and loop if additional descriptors are found

       //appBase:webapps File appBase.list:所存放的工程
        deployWARs(appBase, appBase.list());

  /**

 

     * Deploy WAR files.
     */
    protected void deployWARs(File appBase, String[] files) {
        
        if (files == null)
            return;
        
        for (int i = 0; i < files.length; i++) {
            
            if (files[i].equalsIgnoreCase("META-INF"))
                continue;
            if (files[i].equalsIgnoreCase("WEB-INF"))
                continue;
            File dir = new File(appBase, files[i]);
            if (files[i].toLowerCase().endsWith(".war") && dir.isFile()) {
                
                // Calculate the context path and make sure it is unique
                String contextPath = "/" + files[i].replace('#','/');
                int period = contextPath.lastIndexOf(".");
                if (period >= 0)
                    contextPath = contextPath.substring(0, period);
                if (contextPath.equals("/ROOT"))
                    contextPath = "";
                
                if (isServiced(contextPath))
                    continue;
                
                String file = files[i];
                //以上是对每一个工程名以及路径进行解析
                //这一步才进行部暑
                deployWAR(contextPath, dir, file);
                
            }
            
        }
        
    }

  /**

     * @param contextPath
     * @param war
     * @param file
     */
    protected void deployWAR(String contextPath, File war, String file) {
        
        if (deploymentExists(contextPath))
            return;
        
        // Checking for a nested /META-INF/context.xml
        JarFile jar = null;
        JarEntry entry = null;
        InputStream istream = null;
        BufferedOutputStream ostream = null;
        File xml = new File
            (configBase, file.substring(0, file.lastIndexOf(".")) + ".xml");
        if (deployXML && !xml.exists()) {
            try {
                jar = new JarFile(war);
                entry = jar.getJarEntry(Constants.ApplicationContextXml);
                if (entry != null) {
                    istream = jar.getInputStream(entry);
                    
                    configBase.mkdirs();
                    
                    ostream =
                        new BufferedOutputStream
                        (new FileOutputStream(xml), 1024);
                    byte buffer[] = new byte[1024];
                    while (true) {
                        int n = istream.read(buffer);
                        if (n < 0) {
                            break;
                        }
                        ostream.write(buffer, 0, n);
                    }
                    ostream.flush();
                    ostream.close();
                    ostream = null;
                    istream.close();
                    istream = null;
                    entry = null;
                    jar.close();
                    jar = null;
                }
            } catch (Exception e) {
                // Ignore and continue
                if (ostream != null) {
                    try {
                        ostream.close();
                    } catch (Throwable t) {
                        ;
                    }
                    ostream = null;
                }
                if (istream != null) {
                    try {
                        istream.close();
                    } catch (Throwable t) {
                        ;
                    }
                    istream = null;
                }
            } finally {
                entry = null;
                if (jar != null) {
                    try {
                        jar.close();
                    } catch (Throwable t) {
                        ;
                    }
                    jar = null;
                }
            }
        }
        //这个是用来存放已经部暑好的文件
        DeployedApplication deployedApp = new DeployedApplication(contextPath);
        
        // Deploy the application in this WAR file
        if(log.isInfoEnabled()) 
            log.info(sm.getString("hostConfig.deployJar", file));

        try {
            Context context = null;
            if (deployXML && xml.exists()) {
                synchronized (digester) {
                    try {
                        context = (Context) digester.parse(xml);
                        if (context == null) {
                            log.error(sm.getString("hostConfig.deployDescriptor.error",
                                    file));
                            return;
                        }
                    } finally {
                        digester.reset();
                    }
                }
                context.setConfigFile(xml.getAbsolutePath());
                deployedApp.redeployResources.put
                    (xml.getAbsolutePath(), new Long(xml.lastModified()));
            } else {
                context = (Context) Class.forName(contextClass).newInstance();
            }

            // Populate redeploy resources with the WAR file
            deployedApp.redeployResources.put
                (war.getAbsolutePath(), new Long(war.lastModified()));

            if (context instanceof Lifecycle) {
                Class clazz = Class.forName(host.getConfigClass());
                LifecycleListener listener =
                    (LifecycleListener) clazz.newInstance();
                ((Lifecycle) context).addLifecycleListener(listener);
            }
            context.setPath(contextPath);
            context.setDocBase(file);
            //以下这一步跟进去,StandardContext的启动
            host.addChild(context);
            // If we're unpacking WARs, the docBase will be mutated after
            // starting the context
            if (unpackWARs && (context.getDocBase() != null)) {
                String name = null;
                String path = context.getPath();
                if (path.equals("")) {
                    name = "ROOT";
                } else {
                    if (path.startsWith("/")) {
                        name = path.substring(1);
                    } else {
                        name = path;
                    }
                }
                name = name.replace('/', '#');
                File docBase = new File(name);
                if (!docBase.isAbsolute()) {
                    docBase = new File(appBase(), name);
                }
 		//将部暑完的工程存放进该map中
                deployedApp.redeployResources.put(docBase.getAbsolutePath(),
                        new Long(docBase.lastModified()));
                addWatchedResources(deployedApp, docBase.getAbsolutePath(), context);
            } else {
                addWatchedResources(deployedApp, null, context);
            }
        } catch (Throwable t) {
            log.error(sm.getString("hostConfig.deployJar.error", file), t);
        }
        
        deployed.put(contextPath, deployedApp);
    }

  //以下这一步跟进去,StandardContext的启动

            host.addChild(context);
private void addChildInternal(Container child) {

        if( log.isDebugEnabled() )
            log.debug("Add child " + child + " " + this);
        synchronized(children) {
            if (children.get(child.getName()) != null)
                throw new IllegalArgumentException("addChild:  Child name '" +
                                                   child.getName() +
                                                   "' is not unique");
            child.setParent(this);  // May throw IAE
            children.put(child.getName(), child);

            // Start child
            if (started && startChildren && (child instanceof Lifecycle)) {
                boolean success = false;
                try {
		    //StandardContext的启动
                    ((Lifecycle) child).start();
                    success = true;
                } catch (LifecycleException e) {
                    log.error("ContainerBase.addChild: start: ", e);
                    throw new IllegalStateException
                        ("ContainerBase.addChild: start: " + e);
                } finally {
                    if (!success) {
                        children.remove(child.getName());
                    }
                }
            }

            fireContainerEvent(ADD_CHILD_EVENT, child);
        }

    }

 StandardContext#start//由于里面的方法过长,就对里面的个别调用进行详解

 public synchronized void start() throws LifecycleException {
     if( !initialized ) { 
            try {
               //war文件解压缩成工程就是在这步执行
                init();
            } catch( Exception ex ) {
                throw new LifecycleException("Error initializaing ", ex);
            }
        }
	
}

 以上是对环境部暑启动的简单调试过程,没能全部理解清楚,,会根据后面的调试补全

主要是做了把工程文件存放在DeployedApplication这个类里的  deployedApp.redeployResources.put(docBase.getAbsolutePath(),

                        new Long(docBase.lastModified()));以备访问调用 

0
0
分享到:
评论

相关推荐

    apache-tomcat-7.0.81-src 源码免费下载

    Apache Tomcat 7.0.81 源码分析 Apache Tomcat 是一个流行的开源软件,用Java语言编写,是实现Java Servlet和JavaServer Pages(JSP)规范的应用服务器,广泛用于Web应用的开发和部署。源码的下载对于开发者来说...

    apache-tomcat-6.0.35和apache-tomcat-6.0.35 src

    3. **源码分析**: - `apache-tomcat-6.0.35-src.zip`提供了Tomcat的完整源代码,开发者可以深入理解Tomcat的工作原理,学习Servlet容器的设计和实现,或者进行自定义扩展和调试。 - 源代码中的关键模块包括`...

    apache-tomcat-9.0.8-src源码资源

    它的源码资源对于我们理解Tomcat的工作原理、进行定制开发或者优化性能都具有极大的价值。`apache-tomcat-9.0.8-src`这个压缩包包含了Tomcat 9.0.8版本的完整源代码,这是学习和研究Tomcat的绝佳材料。 1. **Tomcat...

    Tomcat源码apache-tomcat-8.5.47-src.zip

    在开始学习Tomcat源码之前,首先需要了解一些基本概念。Java Servlet是Java平台上的一个标准接口,用于处理HTTP请求。而JSP则是用于创建动态网页的Java技术,它将业务逻辑和页面展示分离。Tomcat作为Servlet容器,...

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    本篇将详细介绍如何使用Ant编译Tomcat源码,以及如何在MyEclipse环境中导入并运行Tomcat源码。 首先,Ant是Apache软件基金会开发的Java项目自动化构建工具,它能够执行编译、测试、打包等任务。在Apache Tomcat的...

    apache-tomcat-6.0.29.zip

    在本压缩包"apache-tomcat-6.0.29.zip"中,包含的是Apache Tomcat 6.0.29版本的源码、配置文件、库文件以及相关的文档资料。 Tomcat 6.0.29是Apache Tomcat的一个稳定版本,发布于2010年,支持Java EE 5规范。以下...

    apache-tomcat-9.0.14-src源码

    对于初次接触Tomcat源码的开发者,可以从阅读`src/main/java`目录下的源码开始,重点关注`org.apache.catalina`包下的类,以及`org.apache.coyote`和`org.apache.jasper`等包。同时,`conf/server.xml`是配置整个...

    apache-tomcat-7.0.59,apache-tomcat-7.0.69 源码

    源码中,`catalina`目录包含了服务器启动、配置加载、容器管理、生命周期管理和请求处理的相关代码。`org.apache.catalina`包下的类是Catalina的核心,如`Engine`、`Host`、`Context`和`Wrapper`,它们代表了不同...

    tomcat7.0.42源码,eclipse直接使用

    Eclipse是一个广泛使用的Java集成开发环境(IDE),它支持直接导入和管理Tomcat源码。在Eclipse中,开发者可以通过导入“Existing Projects into Workspace”来加载Tomcat源码。然后,可以利用Eclipse的强大功能,如...

    apache-tomcat-6.0.37

    2. **启动与停止**:使用bin目录下的startup.sh(Unix/Linux)或startup.bat(Windows)脚本来启动Tomcat,shutdown.sh或shutdown.bat则用于关闭服务。 3. **部署应用**:应用程序通常以WAR(Web ARchive)文件的...

    apache-tomcat-7.0.39-src

    Apache Tomcat 7.0.39 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。Tomcat作为一个轻量级的应用服务器,尤其适合运行简单的Java Web应用。以下是...

    tomcat8源码-eclipse工程

    7. **Eclipse集成**:在Eclipse中导入Tomcat源码,可以方便地进行调试、代码分析和自定义修改。这需要配置Tomcat插件,设置源代码路径,以及正确配置项目的构建路径。 8. **部署与调试**:在Eclipse中如何部署Web...

    tomcat-7.0.42-src源码爱好者(已编译导入直接可用)

    通过研究Tomcat源码,开发者可以了解到HTTP请求的处理流程、Servlet容器的工作方式、以及如何高效地管理Web应用。此外,了解Tomcat源码还可以帮助开发者借鉴其设计模式和架构,以便在日常开发中构建更稳定、高效的...

    tomcat-7.0.90-src-源码

    深入Tomcat源码,我们可以学习到以下关键知识点: 1. **Web应用部署**:Tomcat如何解析`WEB-INF/web.xml`配置文件,加载Servlet和Filter,以及如何根据`META-INF/context.xml`设置上下文参数。 2. **生命周期管理*...

    apache-tomcat-9.0.8-src可直接导入eclipse的源码

    了解并分析Tomcat源码对于深入理解Java Web应用的部署和执行机制非常有帮助。 源码包"apache-tomcat-9.0.8-src"包含了Tomcat的所有源代码,包括核心组件、模块和服务。它由多个子目录构成,每个目录对应Tomcat的...

    apache-tomcat-9.0.34-src.zip

    Apache Tomcat是一个开源的Java Servlet容器,主要用于实现JavaServer Pages (JSP)、Java Servlet以及Java EE的Web应用程序。在本例中,我们讨论的是Apache Tomcat 9.0.34的源代码版本,即"apache-tomcat-9.0.34-src...

    linux -win 源码apache-tomcat-8.5.78

    Apache Tomcat 8.5.78 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它实现了Java EE的Web应用程序部分,即Servlet和JSP规范,允许开发者构建和部署动态Web应用。在这个源码...

    apache-tomcat-8.5.9-src

    【Apache Tomcat 8.5.9 源码解析】 Apache Tomcat 是一个开源的、免费的应用服务器,主要用于部署Java Servlet 和 JavaServer Pages (JSP) 应用程序。这个压缩包 "apache-tomcat-8.5.9-src" 包含了Tomcat 8.5.9 ...

    tomcat8-redis-session共享

    如果还没有,可以下载Redis源码编译安装,或者使用Docker等容器化工具快速启动。 2. **添加依赖**:在Tomcat的`lib`目录下,添加与Redis相关的Java库,例如`spring-session-data-redis`或`jedis`。压缩包中的jar...

    tomcat8源码

    Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,...因此,对Tomcat源码的学习对于Java Web开发者来说是至关重要的。

Global site tag (gtag.js) - Google Analytics