分析源码有时候是件枯燥乏味的事,特别是在你看不懂逻辑的时候,找不到下手点的时候。所以呢,这里,我总结下我分析源码的过程方法,和大家一起探讨下,看看还有什么更好的方法没有!
- 首先我一般会下载对应源代码,这样方便添加注释,方便记录每一部分的含义
2.下载的源码,我都会在本地搭建好可运行的环境,保证通过debug的方式,源码是可以运行的。如tomcat的分析,下载了tomcat7的源码(http://archive.apache.org/dist/tomcat/),然后把项目用idea打开。tomcat是通过ant编译的,悲哀的是我本地并没安装ant环境,怎么办?我没有再去花精力搞ant环境,看了下tomcat的源码,都在java这个目录下
简单的做法就是,找到一个可运行的tomcat,将其lib包下的依赖包,导入源码中,也同样添加lib目录
image.png
右键add到class环境中,此时再看java下的源码,报错自然就没了。当然有零星的报错,需要自己解决,缺什么包导入什么包即可。
- 让本地tomcat可运行。可运行的要求就是,这个项目一定是可以启动的,并且我可以通过debug的方式进行调试。这就需要一点点的tomcat源码知识了,不过我先透露下做法,通过分析脚本,我知道tomcat的启动入口是在org.apache.catalina.startup.Bootstrap类,启动时需要的参数有不少,所以,通过修改catali na.sh文件,在eval执行脚本上加入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 "&"
这样我们找到了常用的参数,当然可能有的参数有默认值。不过,不管这个,先统一加上
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);
}
}
一个简单的测试,就可以通过args2来启动调试tocmat源码了。
总结下,说了半天,原则就是能debug的源码,我一定会想法本地编译环境,模拟启动,通过debug去分析,毕竟强大的debug是我们的解惑神器。想我最初研究php的时候,就是困惑于不会用php的调试功能,每次都要通过页面打印的方式,感觉压力山大!
好了,闲言少叙,书归正文,下面开始脚本的分析。
目录: https://www.jianshu.com/p/8c63da71ab6c
下一篇: tomcat 启动脚本分析部分
网友评论