private static Bootstrap daemon = null; private static final File catalinaBaseFile; private static final File catalinaHomeFile; private static final Pattern PATH_PATTERN = Pattern.compile("(\".*?\")|(([^,])*)"); static { // Will always be non-null String userDir = System.getProperty("user.dir"); // Home first String home = System.getProperty(Globals.CATALINA_HOME_PROP); File homeFile = null; if (home != null) { File f = new File(home); try { homeFile = f.getCanonicalFile(); } catch (IOException ioe) { homeFile = f.getAbsoluteFile(); } } if (homeFile == null) { // First fall-back. See if current directory is a bin directory // in a normal Tomcat install File bootstrapJar = new File(userDir, "bootstrap.jar"); if (bootstrapJar.exists()) { File f = new File(userDir, ".."); try { homeFile = f.getCanonicalFile(); } catch (IOException ioe) { homeFile = f.getAbsoluteFile(); } } } if (homeFile == null) { // Second fall-back. Use current directory File f = new File(userDir); try { homeFile = f.getCanonicalFile(); } catch (IOException ioe) { homeFile = f.getAbsoluteFile(); } } catalinaHomeFile = homeFile; System.setProperty( Globals.CATALINA_HOME_PROP, catalinaHomeFile.getPath()); // Then base String base = System.getProperty(Globals.CATALINA_BASE_PROP); if (base == null) { catalinaBaseFile = catalinaHomeFile; } else { File baseFile = new File(base); try { baseFile = baseFile.getCanonicalFile(); } catch (IOException ioe) { baseFile = baseFile.getAbsoluteFile(); } catalinaBaseFile = baseFile; } System.setProperty( Globals.CATALINA_BASE_PROP, catalinaBaseFile.getPath()); }
上篇關於JVM類加載過程便是學習tomcat源碼學習過程當中學習到的 http://blog.sina.com.cn/s/blog_ae63f79a0102vw94.htmlhtml
咱們查看bootstrap類的源碼,能夠發現,在類加載過程當中,已經嘗試從系統環境變量中獲取 catalina.home和java
catalina.base的值了,若獲取不到則給這兩個變量catalinaBaseFile,catalinaHomeFile賦值當前路徑並建立兩個文件。apache
接下來是main函數的執行,建立Bootstrap對象後,bootstrap先調用成員函數 bootstrap.init(); 在()中調用initClassLoaders中嘗試從conf文件夾下的catalina.properties文件中加載屬性,分別建立三個ClassLoader,即Bootstrap類中的三個成員變量:commonLoader,catalinaLoader和sharedLoader。bootstrap
這裏能夠討論下classloadertomcat
ClassLoader即類加載子系統,負責加載編譯好的.class字節碼文件,並裝入內存,使JVM能夠實例化或以其餘方式使用加載後的類(好比說java很是經常使用的反射)。JVM的類加載子系統支持運行時的動態裝載,動態加載有不少的優勢,例如能夠節省內存空間、靈活地從網絡上加載類,動態加載還有一個好處是能夠經過命名空間的分隔來實現類的隔離,加強了整個系統的安全性。安全