咱们会把工程打成war包部署到tomcat中,而后由容器来对其进行解压,这个过程是怎么样的呢? 接下来我拉把这个面纱揭开看一下,tomcat源代码以下:[b]1.[/b]URL war = new URL("jar:" + (new File(docBase)).toURI().toURL() + "!/");// Expand the WAR into the new document base directory JarURLConnection juc = (JarURLConnection) war.openConnection(); juc.setUseCaches(false); JarFile jarFile = null; InputStream input = null; try { jarFile = juc.getJarFile(); Enumeration jarEntries = jarFile.entries(); while (jarEntries.hasMoreElements()) { JarEntry jarEntry = (JarEntry) jarEntries.nextElement(); String name = jarEntry.getName(); int last = name.lastIndexOf('/'); if (last >= 0) { File parent = new File(docBase, name.substring(0, last)); parent.mkdirs(); } if (name.endsWith("/")) { continue; } input = jarFile.getInputStream(jarEntry); // Bugzilla 33636 File expandedFile = expand(input, docBase, name); long lastModified = jarEntry.getTime(); if ((lastModified != -1) && (lastModified != 0) && (expandedFile != null)) { expandedFile.setLastModified(lastModified); } input.close(); input = null; } } catch (IOException e) { // If something went wrong, delete expanded dir to keep things // clean deleteDir(docBase); throw e; } finally { if (input != null) { try { input.close(); } catch (Throwable t) { ; } input = null; } if (jarFile != null) { try { jarFile.close(); } catch (Throwable t) { ; } jarFile = null; } }[b]2.[/b]熟悉tomcat的兄弟都知道,容器在启动的时候其实执行的是两个过程,第一:初始化,第二:启动过程; 而就是在启动HOST的过程当中,触发一个start事件,lifecycle.fireLifecycleEvent(START_EVENT, null);执行到HostConfig类的lifecycleEvent方法中,而后执行start()方法,deployApps方法 —》deployWARs(appBase, appBase.list()); 而后执行到StandardHost的addChild方法 启动StandardContext类的start方法,init方法, fixDocBase()方法,在这个类里会调用ExpandWar.expand(host, war, contextPath);来进行war包的解压,就到此为止,