9

我想了解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课堂? (或在主启动线程上运行的其他类)

4

3 回答 3

7

您可以将 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 进程。(运行 -> 调试配置 -> 远程 Java 应用程序。)

截屏: 使用 JPDA_OPTS 调试 Tomcat

于 2013-06-05T13:04:41.347 回答
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

你去吧。

于 2021-03-24T15:33:01.987 回答
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 构建路径。确保在 Order and Export 选项卡下 java 文件夹是列表中的第一个。

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

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

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

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

这应该可以解决问题!

于 2019-03-22T19:07:20.580 回答