如何进入tomcat源码?

时间:2013-06-05 05:37:06

标签: java eclipse debugging tomcat

我想学习tomcat操作的内部结构并理解流程。

为此,我创建了一个servlet -

public class TestServlet extends HttpServlet {
    //Breakpoint set on constructor
    public TestServlet() {
    }
}

我在源查找目录中包含了tomcat源代码,并以调试模式启动了服务器。以下是调试器在断点处停止时的堆栈跟踪 -

Daemon Thread [localhost-startStop-1] (Suspended (entry into method <init> in TestServlet)) 
    owns: StandardWrapper  (id=39)  
    owns: StandardContext  (id=40)  
    TestServlet.<init>() line: 12   
    NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]   
    NativeConstructorAccessorImpl.newInstance(Object[]) line: 39    
    DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 27    
    Constructor<T>.newInstance(Object...) line: 513 
    Class<T>.newInstance0() line: 355   
    Class<T>.newInstance() line: 308    
    DefaultInstanceManager.newInstance(String) line: 138    
    StandardWrapper.loadServlet() line: 1144    
    StandardWrapper.load() line: 1088   
    StandardContext.loadOnStartup(Container[]) line: 5123   
    StandardContext.startInternal() line: 5407  
    StandardContext(LifecycleBase).start() line: 150    
    ContainerBase$StartChild.call() line: 1559  
    ContainerBase$StartChild.call() line: 1549  
    FutureTask$Sync.innerRun() line: 303    
    FutureTask<V>.run() line: 138   
    ThreadPoolExecutor$Worker.runTask(Runnable) line: 886   
    ThreadPoolExecutor$Worker.run() line: 908   
    Thread.run() line: 662

正如您所见,tomcat启动了一个新的守护程序线程来处理TestServlet的初始化。如果我从这个位置退出,它将回溯到运行然后停止。但是我想了解主服务器逻辑。 我应该怎样做才能进入org.apache.catalina.startup.Bootstrap类?(或在主要启动线程上运行的其他类)

3 个答案:

答案 0 :(得分:6)

您可以将Tomcat调试为远程Java应用程序。

以下是步骤:

  1. 创建Java项目并将Tomcat源文件复制到项目的源文件夹中。 (您可以忽略编译错误。)
  2. 打开Bootstrap.java并在main方法中设置断点。
  3. 创建CATALINA_BASE / bin / setenv.bat(或.sh)文件并将以下行放入文件中。

    set JPDA_OPTS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y

  4. 从命令行使用catalina.bat(或.sh)以调试模式启动Tomcat。

    catalina.bat jpda start

  5. 从Eclipse中,在Remote Java Application下设置Debug Configuration并连接到Tomcat进程。 (运行 - &gt;调试配置 - &gt;远程Java应用程序。)

  6. 截图: Tomcat debugging using JPDA_OPTS

答案 1 :(得分:1)

不要去寻找任何令人困惑的解决方案。 经过大量研究后发现了这一点。

  • 只需使用 eclipse 设置您的 tomcat。
  • 稍后下载 tomcat 源文件并执行 ant 命令。
  • Nw 转到您的 JavaEE 设置 => 选择 new project => ava Project from Existing Ant Buildfile => point to tomcat source code 和 选择build.xml
  • 相应地设置断点,在我的情况下,bootstrap.java 的 main() 方法。
  • 转到您的服务器and select调试`
  • 这应该会打开您设置断点的类。如果 有名为 Source not Found 的警告,点击 add source => java project => select the source project

给你。

答案 2 :(得分:0)

我所做的是:

  1. 下载Tomcat GitHub存储库的zip文件。

  2. 打开Eclipse,并创建一个新的Java项目。

  3. 将您从Tomcat GitHub下载的zip文件中的所有内容提取到新的Java项目中。

  4. 所有文件夹都存在后,创建一个新的源文件夹:右键单击项目>新建>源文件夹

  5. 命名该文件夹src

  6. 将所有内容从java文件夹移至此“ src”文件(原因:Eclipse将重新组织这些文件夹以使其成为软件包。请检查源内部,您将仅看到软件包。否则,我必须这样做运行配置无法识别我给主类的路径

  7. 删除java文件夹(从中提取数据),并将src文件夹重命名为“ java”(以保持相同的路径)

  8. 右键单击项目>属性> Java构建路径。确保在“订购和出口”选项卡下,java文件夹是列表中的第一个文件夹。

  9. 现在进入“运行”>“运行配置” ...创建一个新的“ Java应用程序”配置

  10. 将项目设置为Tomcat项目,并将主类设置为“ org / apache / catalina / startup / Bootstrap”

  11. 在Bootstrap.java文件中添加一个断点(我相信该文件是从init()执行的)

  12. 使用您刚刚设置的配置进行调试,方法是单击错误图标(代表“调试”)旁边的向下箭头,然后选择刚刚设置的“运行配置”。

这应该可以解决问题!