Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法,第1张

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

本文主要介绍在Idea中启动tomcat源代码调试和在tomcat中调试的方法。这篇文章很详细,对你的学习或者工作有一定的参考价值。有需要的朋友可以参考一下。

使用idea开发工具调试代码时,如果是javaweb项目,tomcat作为web容器,调试跟踪中断。当它被追踪到org.apache.catalina包时,就不能被访问了。这是因为idea运行的tomcat是插件集成的,tomcat中的lib包已经不在项目的依赖路径中,所以无法跟踪。

首先在自己项目中tomcat回调的接口实现类中标记一个断点信息,通过idea启动web项目。当断点信息出现如图时,由于断点位置标有tomcat回调的接口类,所以根据调用栈是互联网上的tomcat内部代码。但是此时双击org.apache.catalina包下的类名没有反应,因为我们还没有将tomcat对应的依赖文件添加到类路径中。

添加依赖项

<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <version>8.5.55</version> <scope>provided</scope> </dependency>

因为运行时使用tomcat的lib目录下的jar文件,所以这里的作用域使用提供的方法。

现在您可以调试tomcat源代码了

tomcat启动日志是如何执行和键入的?

03-Jun-202010:31:30.929信息[主]org.Apache.catalina.startup.Versionloggerlistener.logServer.服务器版本:ApacheTomcat/8.5.55
03-Jun-202010:31:30.938信息[主]org.Apache.catalina.startup.Versionloggerlistener.log服务器构建:2020年5月5日22:10JRE
03-Jun-202010:31:30.939信息[main]org.Apache.catalina.startup.versionloggerlistener.logJava虚拟机版本:1.8.0_212-B10
03-Jun-202010:31:30.939信息[main]org.Apache.catalina.startup.versionloggerlistener.logJVM.供应商:甲骨文公司IntelliJidea2018.3\System\Tomcat\unnamed_spring-Shiro-training
03-Jun-202010:31:30.939资讯[main]org.Apache.catalina.startup.versionloggerlistener.logcatalina_home:。

您可以通过导航到VersionLoggerListener日志来查看它。

privatevoidlog(){ log.info(sm.getString("versionLoggerListener.serverInfo.server.version", ServerInfo.getServerInfo())); log.info(sm.getString("versionLoggerListener.serverInfo.server.built", ServerInfo.getServerBuilt())); log.info(sm.getString("versionLoggerListener.serverInfo.server.number", ServerInfo.getServerNumber())); log.info(sm.getString("versionLoggerListener.os.name", System.getProperty("os.name"))); log.info(sm.getString("versionLoggerListener.os.version", System.getProperty("os.version"))); log.info(sm.getString("versionLoggerListener.os.arch", System.getProperty("os.arch"))); log.info(sm.getString("versionLoggerListener.java.home", System.getProperty("java.home"))); log.info(sm.getString("versionLoggerListener.vm.version", System.getProperty("java.runtime.version"))); log.info(sm.getString("versionLoggerListener.vm.vendor", System.getProperty("java.vm.vendor"))); log.info(sm.getString("versionLoggerListener.catalina.base", System.getProperty("catalina.base"))); log.info(sm.getString("versionLoggerListener.catalina.home", System.getProperty("catalina.home"))); if(logArgs){ List<String>args=ManagementFactory.getRuntimeMXBean().getInputArguments(); for(Stringarg:args){ log.info(sm.getString("versionLoggerListener.arg",arg)); } } if(logEnv){ SortedMap<String,String>sortedMap=newTreeMap<>(System.getenv()); for(Map.Entry<String,String>e:sortedMap.entrySet()){ log.info(sm.getString("versionLoggerListener.env",e.getKey(),e.getValue())); } } if(logProps){ SortedMap<String,String>sortedMap=newTreeMap<>(); for(Map.Entry<Object,Object>e:System.getProperties().entrySet()){ sortedMap.put(String.valueOf(e.getKey()),String.valueOf(e.getValue())); } for(Map.Entry<String,String>e:sortedMap.entrySet()){ log.info(sm.getString("versionLoggerListener.prop",e.getKey(),e.getValue())); } } }

发现是通过键值对获得的,然后通过字符串全局搜索找到

但是和英文匹配,那么中文是怎么打出来的呢?

最后我通过调试发现了这个。

类似上面的东西,调试的时候发现关于tocmatstarted的东西还是挺多的
再看下面这个。

ideatomcat启动后的数据

03-Jun-202010:31:30.939信息[main]org.Apache.catalina.startup.versionloggerlistener.log命令行参数:-DJava.util.logging.config.file=c:\users\administrator\.intellijidea2018.3\system\Tomcat\Unnamed_spring-Shiro-training\conf\logging.properties
03-Jun-20201010:31:30.949debugger-agent.jar
03-Jun-202010:31:30.940信息[main]org.Apache.catalina.startup.versionloggerlistener.log命令行参数:-dfile.encoding=UTF-8[/] 03-Jun-202010:31:30.940信息[main]org.Apache.catalina.startup.versionloggerlistener.log命令行参数:-DCintellijidea2018.3\system\Tomcat\Unnamed_spring-Shiro-training\JMremote.access
03-Jun-202010:31:30.940信息[main]org.Apache.catalina.startup.versionloggerlistener.log命令行参数:-DJava.RMI.server.hostname=127.0.0.1
03-Jun-202010:未命名_Spring-Shiro-Training
03-Jun-202010:31:30.941信息[main]org.Apache.catalina.startup.versionloggerlistener.log命令行参数:-dcatalina.home=d:\Tomcat8.5.55\Apache-Tomcat-8.5.55
03-Jun-202010:31:30.941

以上只是基本的环境配置等。启动
,然后准备链接到tomcat服务。

03-Jun-202010:31:30.941信息[main]org.Apache.catalina.core.aplifecyclelistener.life事件使用APR版本[1.7.0]加载ApacheTomcat本地库[1.2.24]基于APR.
03-Jun-202010:31:30.941信息[main]org.Apache.catalina.core.aplifeclelistener使用OpenSSL[true]
03-Jun-202010:31:30.944信息[main]org.Apache.Catalina.core.aprlivecyclelistener.initializeSSLOpenSSL已成功初始化[OpenSSL1.1.1g21ar2020]
03-Jun-202010:31:31.032信息[main]Org.apache.coyoteorg.Apache.catalina.core.standardengine.Start内部启动servlet引擎:ApacheTomcat/8.5.55
03-Jun-202010:31:31.089信息[main]org.Apache.coyote.abstractProtocol.Start启动协议处理句柄["http-nio-8080"]
03-Jun-20201010:30org.Apache

Tomat创业主要在卡特琳娜。


然后

开始

/** *Awaitandshutdown. */ publicvoidawait(){ getServer().await(); }

实际上,tomcatstartup本质上是socket的服务器。

@Override publicvoidawait(){ //Negativevalues-don'twaitonport-tomcatisembeddedorwejustdon'tlikeports if(port==-2){ //undocumentedyet-forembeddingappsthatarearound,alive. return; } if(port==-1){ try{ awaitThread=Thread.currentThread(); while(!stopAwait){ try{ Thread.sleep(10000); }catch(InterruptedExceptionex){ //continueandchecktheflag } } }finally{ awaitThread=null; } return; } //Setupaserversockettowaiton try{ awaitSocket=newServerSocket(port,1, InetAddress.getByName(address)); }catch(IOExceptione){ log.error("StandardServer.await:create["+address +":"+port +"]:",e); return; } try{ awaitThread=Thread.currentThread(); //Loopwaitingforaconnectionandavalidcommand while(!stopAwait){ ServerSocketserverSocket=awaitSocket; if(serverSocket==null){ break; } //Waitforthenextconnection Socketsocket=null; StringBuildercommand=newStringBuilder(); try{ InputStreamstream; longacceptStartTime=System.currentTimeMillis(); try{ socket=serverSocket.accept();//一旦accecpt后面就开始执行了 socket.setSoTimeout(10*1000);//Tenseconds stream=socket.getInputStream(); }catch(SocketTimeoutExceptionste){ //Thisshouldneverhappenbutbug56684suggeststhat //itdoes. log.warn(sm.getString("standardServer.accept.timeout", Long.valueOf(System.currentTimeMillis()-acceptStartTime)),ste); continue; }catch(AccessControlExceptionace){ log.warn(sm.getString("standardServer.accept.security"),ace); continue; }catch(IOExceptione){ if(stopAwait){ //Waitwasabortedwithsocket.close() break; } log.error(sm.getString("standardServer.accept.error"),e); break; } //Readasetofcharactersfromthesocket intexpected=1024;//CutofftoavoidDoSattack while(expected<shutdown.length()){ if(random==null) random=newRandom(); expected+=(random.nextInt()%1024); } while(expected>0){ intch=-1; try{ ch=stream.read(); }catch(IOExceptione){ log.warn(sm.getString("standardServer.accept.readError"),e); ch=-1; } //ControlcharacterorEOF(-1)terminatesloop if(ch<32||ch==127){ break; } command.append((char)ch); expected--; } }finally{ //Closethesocketnowthatwearedonewithit try{ if(socket!=null){ socket.close(); } }catch(IOExceptione){ //Ignore } } //Matchagainstourcommandstring booleanmatch=command.toString().equals(shutdown); if(match){ log.info(sm.getString("standardServer.shutdownViaPort")); break; }else log.warn(sm.getString("standardServer.invalidShutdownCommand",command.toString())); } }finally{ ServerSocketserverSocket=awaitSocket; awaitThread=null; awaitSocket=null; //Closetheserversocketandreturn if(serverSocket!=null){ try{ serverSocket.close(); }catch(IOExceptione){ //Ignore } } } }

tomcat容器启动后,下面是Springmvc模块的内容。


关于如何在Idea中调试tomcat启动源代码以及如何在tomcat内部调试的文章到此结束。请搜索我们之前的文章或继续浏览以下相关文章,了解更多Idea中tocmat启动源代码的调试内容。希望大家以后能多多支持我们!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存