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

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

右鍵add到class環(huán)境中,此時(shí)再看java下的源碼,報(bào)錯(cuò)自然就沒了。當(dāng)然有零星的報(bào)錯(cuò),需要自己解決,缺什么包導(dǎo)入什么包即可。
- 讓本地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)腳本分析部分