代码改变世界

struts2 src study 准备工作 和 略谈 如何读开源代码(Java)

2011-03-05 22:12  chen.simon  阅读(769)  评论(0编辑  收藏  举报

第一个最简单的struts2工程,将xworks-core和struts-core的lib包替换成源码,然后需要的jar包有:

E:\simon\debug_workspace_0225\s2-src-study\WebContent\WEB-INF\lib>tree /f

卷 新加卷 的文件夹 PATH 列表
卷序列号为 DC32-D1F0
E:.
    asm-3.0.jar
    asm-commons-3.0.jar
    commons-collections-3.2.jar
    commons-fileupload-1.2.1.jar
    commons-io-1.3.2.jar
    commons-lang-2.6.jar
    commons-logging-1.0.4.jar
    common_lang_IO4xworks.jar
    freemarker-2.3.16.jar
    javassist-3.7.ga.jar
    junit-3.8.1.jar
    ognl-3.0.jar
    spring-beans-2.5.6.jar
    spring-context-2.5.6.jar
    spring-core-2.5.6.jar
    spring-web-2.5.6.jar
    testng-5.1-jdk15.jar
    velocity-1.6.3.jar
    velocity-tools-1.3.jar

没有子文件夹

还有 servlet-api.jar   jsp-api.jar

类似于这样的路径下  /home/tools/apache-tomcat-5.5.31/common/lib

注意点有:

1. asm的包需要去asm的官网下,struts2的all包中没有,app中也没有。     javassist-3.7.ga.jar 在那个blank的app中就能找到。all包中也没有提供。

2. apache的common-lang需要2.4以上版本 , 否则StringUtils.startsWith(...)方法找不到,详见common-lang的文档。

3. xworks的包换成源码之后 ,会依赖部分common-lang 和common-io包的class文件,但其打包结构又不同于apache原有的包结构,多了了

    一层xwork,所以不能直接引用。weimao提供的做法是:将需要的class文件按其现有包结构取出打成zip包,再改名成.jar包,放到lib目录下即可

4. tomcat与eclipse集合后,eclipse采取的是虚拟部署,部署路径不是tomcat的webapp下,在类似的E:\simon \debug_workspace_0225\.metadata\.plugins\org.eclipse.wst.server.core \tmp0这个路径下

5. 要放置struts-2.0.dtd ,struts-2.1.7.dtd   dtd文件在src目录下 ,否则会出现解析配置文件时,报错:struts.xml找不到,其实是dtd没有找到

6. default.properties (在struts-core的jar包中),和其他一道的properties文件也要复制到src目录下

====================================================================

点5 没有做  会报错  说struts.xml  文件找不到 其实你已经放了,只是没有放dtd文件。

我一开始被这个问题困扰了好久

点6 没有做 会发生以下异常,我也被困扰了好久

2011-3-5 22:48:58 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info信息: Parsing configuration file [struts.xml]2011-3-5 22:48:59 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn警告: Unable to load config class org.apache.struts2.interceptor.debugging.DebuggingInterceptor at interceptor - file:/root/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/struts2-src-study/WEB-INF/classes/struts-default.xml:131:115 probably due to a missing jar, which might be fine if you never plan to use the debugging interceptor2011-3-5 22:48:59 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error严重: Actual exceptionCaught Exception while registering Interceptor class org.apache.struts2.interceptor.debugging.DebuggingInterceptor - interceptor - file:/root/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/struts2-src-study/WEB-INF/classes/struts-default.xml:131:115at org.apache.struts2.impl.StrutsObjectFactory.buildInterceptor(StrutsObjectFactory.java:77)at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:70)at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.lookupInterceptorReference(XmlConfigurationProvider.java:998)at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStack(XmlConfigurationProvider.java:817)at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStacks(XmlConfigurationProvider.java:830)at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptors(XmlConfigurationProvider.java:853)at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:460)at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:275)at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:111)at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:204)at c............



如何阅读开源代码

最近看到一篇文章  基本认可他的说法

http://jnn.iteye.com/blog/1316930

并且 同时要看单元测试代码 这点非常好

还有我以前在邮件列表中回复过的细节:

我的做法是:
用IDE,我用的Eclipse
在工程中,将需要读的代码替换掉其打包好的jar包
然后能让含有这个要读的代码的工程跑起来
然后边debug边读
当前前提是熟悉这个要读的代码大概有哪些模块,干什么用的

用Eclipse有几点:
上面半仙已经提到一个
“找不到实现类。。。不会用eclipse吗? ctrl+t 啊。。。。“
我再加几个
看某个类或者方法在这个工程中的引用或者调用  ctrl+shift+g
在工程中搜索某个关键字  ctrl+h
在debug时候有 ctrl+shift+i 查看某个变量 或者方法的运行结果,当圈复杂度很高的时候,这样可能不行,

需要在上面的变量窗口中查看(跟断点窗口在一块的)
当某个调用层次不清楚的时候,可以在debug的时候 在你不清除的地方加上Thread.currentThread().getStackTrace() ,然后选中刚加的这段代码, ctrl+shift+i,然后。。

我的做法当中还有一点是:
边阅读,边在代码中阅读感悟和打一些标识,用代码仓库管理这份阅读的代码,以后能清晰看到阅读的轨迹