【问题标题】:How to step into tomcat source?如何步入tomcat源码?
【发布时间】:2013-05-31 16:51:12
【问题描述】:

想学习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 类?(或其他一些在主启动线程上运行的类)

【问题讨论】:

  • 如何在调试模式下启动服务器?您使用 eclipse 的“服务器”,还是将其作为独立应用程序运行?
  • stackoverflow.com/questions/975271/…。但是对于您的问题,您是否尝试过在 Bootstrap 类中放置一个断点,或者您想调试的任何地方?
  • 在Eclipse中按Ctrl+Shift+T,写好类名并打开,像自己代码一样下断点。

标签: java eclipse debugging tomcat


【解决方案1】:

您可以将 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 中,在远程 Java 应用程序下设置调试配置并连接到 Tomcat 进程。 (运行 -> 调试配置 -> 远程 Java 应用程序。)

截图:

【讨论】:

  • 此方法有效,但有一种更简单的方法。无需手动将 JPDA_OPTS 附加到 catalina.sh 或作为远程 Java 应用程序显式连接到它。当您从 Eclipse Server View 以调试模式启动服务器时,Eclipse 会自动执行这两项操作。
【解决方案2】:

不要寻求任何令人困惑的解决方案。 经过大量研究后发现。

  • 只需使用 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 selectdebug`
  • 这应该会打开您设置断点的类。如果 有警告名为Source not Found,点击add source => java project => select the source project

你去。

【讨论】:

    【解决方案3】:

    我所做的是:

    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 构建路径。确保在 Order and Export 选项卡下 java 文件夹是列表中的第一个。

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

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

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

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

    这应该可以解决问题!

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多