我想学习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
类?(或在主要启动线程上运行的其他类)
答案 0 :(得分:6)
您可以将Tomcat调试为远程Java应用程序。
以下是步骤:
创建CATALINA_BASE / bin / setenv.bat(或.sh)文件并将以下行放入文件中。
set JPDA_OPTS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y
从命令行使用catalina.bat(或.sh)以调试模式启动Tomcat。
catalina.bat jpda start
从Eclipse中,在Remote Java Application下设置Debug Configuration并连接到Tomcat进程。 (运行 - &gt;调试配置 - &gt;远程Java应用程序。)
截图:
答案 1 :(得分:1)
不要去寻找任何令人困惑的解决方案。 经过大量研究后发现了这一点。
ant
命令。new project
=> ava Project from Existing Ant Buildfile
=> point to tomcat source code
和
选择build.xml
main()
方法。and select
调试`Source not Found
的警告,点击 add source
=>
java project
=> select the source project
给你。
答案 2 :(得分:0)
我所做的是:
下载Tomcat GitHub存储库的zip文件。
打开Eclipse,并创建一个新的Java项目。
将您从Tomcat GitHub下载的zip文件中的所有内容提取到新的Java项目中。
所有文件夹都存在后,创建一个新的源文件夹:右键单击项目>新建>源文件夹
命名该文件夹src
将所有内容从java文件夹移至此“ src”文件(原因:Eclipse将重新组织这些文件夹以使其成为软件包。请检查源内部,您将仅看到软件包。否则,我必须这样做运行配置无法识别我给主类的路径
删除java文件夹(从中提取数据),并将src文件夹重命名为“ java”(以保持相同的路径)
右键单击项目>属性> Java构建路径。确保在“订购和出口”选项卡下,java文件夹是列表中的第一个文件夹。
现在进入“运行”>“运行配置” ...创建一个新的“ Java应用程序”配置
将项目设置为Tomcat项目,并将主类设置为“ org / apache / catalina / startup / Bootstrap”
在Bootstrap.java文件中添加一个断点(我相信该文件是从init()执行的)
使用您刚刚设置的配置进行调试,方法是单击错误图标(代表“调试”)旁边的向下箭头,然后选择刚刚设置的“运行配置”。
这应该可以解决问题!