二 tomcat 源碼分析技巧

??分析源碼有時(shí)候是件枯燥乏味的事,特別是在你看不懂邏輯的時(shí)候,找不到下手點(diǎn)的時(shí)候。所以呢,這里,我總結(jié)下我分析源碼的過程方法,和大家一起探討下,看看還有什么更好的方法沒有!

  1. 首先我一般會(huì)下載對(duì)應(yīng)源代碼,這樣方便添加注釋,方便記錄每一部分的含義

2.下載的源碼,我都會(huì)在本地搭建好可運(yùn)行的環(huán)境,保證通過debug的方式,源碼是可以運(yùn)行的。如tomcat的分析,下載了tomcat7的源碼(http://archive.apache.org/dist/tomcat/),然后把項(xiàng)目用idea打開。tomcat是通過ant編譯的,悲哀的是我本地并沒安裝ant環(huán)境,怎么辦?我沒有再去花精力搞ant環(huán)境,看了下tomcat的源碼,都在java這個(gè)目錄下

image.png

簡單的做法就是,找到一個(gè)可運(yùn)行的tomcat,將其lib包下的依賴包,導(dǎo)入源碼中,也同樣添加lib目錄
image.png

右鍵add到class環(huán)境中,此時(shí)再看java下的源碼,報(bào)錯(cuò)自然就沒了。當(dāng)然有零星的報(bào)錯(cuò),需要自己解決,缺什么包導(dǎo)入什么包即可。

  1. 讓本地tomcat可運(yùn)行??蛇\(yùn)行的要求就是,這個(gè)項(xiàng)目一定是可以啟動(dòng)的,并且我可以通過debug的方式進(jìn)行調(diào)試。這就需要一點(diǎn)點(diǎn)的tomcat源碼知識(shí)了,不過我先透露下做法,通過分析腳本,我知道tomcat的啟動(dòng)入口是在org.apache.catalina.startup.Bootstrap類,啟動(dòng)時(shí)需要的參數(shù)有不少,所以,通過修改catali na.sh文件,在eval執(zhí)行腳本上加入echo

echo  \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Djava.security.manager \
      -Djava.security.policy==\"$CATALINA_BASE/conf/catalina.policy\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap "$@" start
  eval \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Djava.security.manager \
      -Djava.security.policy==\"$CATALINA_BASE/conf/catalina.policy\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

這段腳本上加入echo,將最終腳本打印出來

"/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre/bin/java" 
"-Djava.util.logging.config.file=/mnt/jenkin-tomcat/conf/logging.properties"
 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
 -Djdk.tls.ephemeralDHKeySize=2048        
 -Dignore.endorsed.dirs=""    
 -classpath "/mnt/jenkin-tomcat/bin/bootstrap.jar:/mnt/jenkin-tomcat/bin/tomcat-juli.jar"    
 -Dcatalina.base="/mnt/jenkin-tomcat"       
 -Dcatalina.home="/mnt/jenkin-tomcat"     
 -Djava.io.tmpdir="/mnt/jenkin-tomcat/temp"   
 org.apache.catalina.startup.Bootstrap start  >> "$CATALINA_OUT" 2>&1 "&"

這樣我們找到了常用的參數(shù),當(dāng)然可能有的參數(shù)有默認(rèn)值。不過,不管這個(gè),先統(tǒng)一加上

import org.apache.catalina.startup.Bootstrap;

public class TestMain {

    public static void main(String[] args) {
        System.setProperty("java.util.logging.config.file","/Users/kai.yang/Desktop/IDSPACE/apache-tomcat-7.0.10-src/conf/logging.properties");
        System.setProperty("jdk.tls.ephemeralDHKeySize","2048");
        System.setProperty("java.util.logging.manager","org.apache.juli.ClassLoaderLogManager");
        System.setProperty("catalina.base","/Users/kai.yang/Desktop/IDSPACE/apache-tomcat-7.0.10-src");
        System.setProperty("catalina.home","/Users/kai.yang/Desktop/IDSPACE/apache-tomcat-7.0.10-src");
        System.setProperty("java.io.tmpdir","/Users/kai.yang/Desktop/IDSPACE/apache-tomcat-7.0.10-src/temp");

        String[] args2=new String[]{"start"};
        Bootstrap.main(args2);
    }

}

一個(gè)簡單的測(cè)試,就可以通過args2來啟動(dòng)調(diào)試tocmat源碼了。

總結(jié)下,說了半天,原則就是能debug的源碼,我一定會(huì)想法本地編譯環(huán)境,模擬啟動(dòng),通過debug去分析,畢竟強(qiáng)大的debug是我們的解惑神器。想我最初研究php的時(shí)候,就是困惑于不會(huì)用php的調(diào)試功能,每次都要通過頁面打印的方式,感覺壓力山大!
??好了,閑言少敘,書歸正文,下面開始腳本的分析。

目錄: ? http://www.itdecent.cn/p/8c63da71ab6c
下一篇: ?tomcat 啟動(dòng)腳本分析部分

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容