Tomcat调试笔记

调试笔记

在使用Tomcat过程中经常碰到问题,导致tomcat启动失败。如下↓

由于报错太过笼统,我根本无法找出错误。后来我切换到Console视图下,看到了如下错误信息。

根据报错信息,错误原因是32bit 的Tomcat不能在AMD 64-bit的platform 上面运行,但是经过查看我发现自己的tomcat和java都是64bit的。

查看tomcat的版本号的链接:→

http://jingyan.baidu.com/article/e73e26c0c4b40024adb6a789.html

或者在如下图的路径下,打开 DOS命令行,将bin目录下的 version.bat 拖入DOS窗口,即可看到  Tomacat的版本号及其平台的bit。

查看java(VM)的版本信息如下:

在设置环境变量之后,可以通过cmd→java -version查看版本号,设置环境变量方法如下:

http://jingyan.baidu.com/article/c85b7a6414f2ee003bac95d5.html

通过以上两图,我们可以看到,tomcat和java vm都是64位,那么为什么会报错呢。我去网上查看了一些方法,但都没有解决我的问题。于是我重新去网上下载了报错文件“tcnative-1.dll”发现“native method Initial”证明native method结束,但是由于重新下载的“tcnative-1”的版本不对,所以报出另一个错误。所以我们可以判断,报错的原因在于“tcnative-1.dll”文件中描述的是32位系统的(至于为什么我也不知道)。所以我去网上重新下载新的Tomcat为了防止报错,我下载了64位/32位集合版。

安装并配置完成后(安装方法和配置流程在上述链接中均有涉及),重新运行。为了验证服务器是否正常,首先运行了“buy”(已无错误)工程,发现能正常运行。然后再运行“medical”发现,服务器再一次报错。

还是一样,这个图并不能说明什么,再次来到console视图,看到错误代码如下:

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/medical]]

at java.util.concurrent.FutureTask.report(FutureTask.java:122)

at java.util.concurrent.FutureTask.get(FutureTask.java:192)

at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)

at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:799)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/medical]]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)

... 6 more

Caused by: java.lang.IllegalArgumentException: The servlets named [RecInfoServlet] and [com.xiazi.servlet.RecInfoServlet] are both mapped to the url-pattern [/RecInfoServlet] which is not permitted

at org.apache.catalina.deploy.WebXml.addServletMapping(WebXml.java:293)

at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2393)

at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2069)

at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2030)

at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2023)

at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2023)

at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2023)

at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1288)

at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:873)

at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:371)

at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)

at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

... 6 more

从上述中我们可以得到报错信息如下:

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/medical]]

Caused by: java.lang.IllegalArgumentException: The servlets named [RecInfoServlet] and

[com.xiazi.servlet.RecInfoServlet] are both mapped to the url-pattern [/RecInfoServlet] which is not permitted

也就是因为两个同名文件共同映射至<url-pattern>而报错,然后通过查询相关解决方法,发现一般人都是因为<url -pattern>内的路径少了”/”(当前路径)的问题,而我并不是因为这个问题。

于是我开始思考,为什么会报错。反而言之,为什么只有一个“RecInfoServlet”会报错。我开始思考:

1.我们对不同的文件进行了重名注册,这明显是最可能出现的情况。但经过改名,排查了该错误。

2.可能是:当我们对同一个servlet进行两次注册时,会不会被编译器判定为两个servlet的同一次注册呢?我开始review我的“RecInfoServlet”,果然我发现了问题。

对比发现,在出错的代码中有servlet向导默认生成的注解,@WebServlet(“.......”),而未报错的servlet中的注解在写代码时,被我删掉。突然意识到,在编写servlet初期,老师强调过要将默认生成的@WebSevlet删掉。因此我删掉了,这行代码。

那么为什么会报错呢,我通过在StackExchange中查找相似的案例,找到了一例。链接如下:

http://stackoverflow.com/questions/16270619/java-lang-illegalargumentexception-the-servlets-named-x-and-y-are-both-mapp

这位跟我发生了相同的错误,下面有解答如下:

也就是说,默认生成的注解“@WebServlet”和我们的部署文件“web.xml”发生了冲突,同一个servlet被注册了两遍,而编译器认为是不同servlet发生了重名。证实了猜想二。

通过这次解决问题,我对tomcat有了一个新的认识。在阅读web.xml和server.xml时,我学到了很多东西。

1.当我运行了一次错误的“medical”之后再去运行正确的“buy”项目,发现服务器会报错,无法开启。通过server.xml代码我发现,每次给服务器加载新的项目时,服务器会有如下声明:

<Context docBase="Buy" path="/Buy" reloadable="true" source="org.eclipse.jst.jee.server:Buy"/><Context docBase="medical" path="/medical" reloadable="true" source="org.eclipse.jst.jee.server:medical"/></Host>

也就是在<host>中会声明加入的工程。而代码自上往下,自左往右的编译过程,导致服务器首先阅读的是错误的“medical”项目配置,而阅读到“Buy”项目时,就发生端口【8005】已被占用的情况。所以当我们需要对服务器进行查错时,首先应该删除server.xml中多余的工程。也可以通过图形化界面将工程移出服务器。

2.当我对web.xml进行阅读的时候,发现了两个web.xml,分别在webcontent下和servers。

我猜想,这大概就是在servlet中加入@WebServlet注解会报错,而平时需要删除注解的原因了。

在阅读WebContent/web.xml时我发现了有趣的部分:

在此处,我们可以看到对6种页面的声明为<welcome-file>也就是我们运行工程时默认首先开启的主页,优先级从上到下。那么在我们有的时候给主页换名时(或者是重新指定主页),我们需要在换名后,来到web.xml对以上代码进行,相应的修改。

而在Server/web.xml中,我们居然发现了更有趣的部分:

也就是说,我们可以指定所有在服务器上运行项目的默认主页。It’s  so  cool.

总结

本次排错,历时8小时有余,收获颇丰。对于服务器和编译器的认识,也发生了巨大的改变,以前认为编译器不会错,现在发现,编译器有的地方也是不合理的。服务器就更奇怪了,各种奇葩的错误也是层出不穷。

在对第二个问题排错时,最有可能的错误没有发生,而相对不可能的错误却发生了。证明在程序界和侦探界有句话是统一的:排除了所有可能,剩下的任何不可能都有可能是真相。

我也学会怎么通过Console来检查和排除错误,这一点在编程生涯中,会让我受益无穷。作为一个web开发者,接下来我应该学会怎么利用浏览器查错排错。

来自为知笔记(Wiz)

时间: 2024-11-18 03:08:31

Tomcat调试笔记的相关文章

基于Maven的web项目在Eclipse中使用Tomcat调试

以前开发用过jetty来调试maven项目,不过那时也有点浑浑噩噩的,就是使用而已,业余时间都奉献给了游戏.最近在鼓捣maven,就记录一下最近搭建Eclipse中使用Tomcat调试maven项目的过程,以后忘记或者中间有什么问题时可以查到. 废话不多说,下面开始搭建: 1. 安装Maven(配置Maven环境变量+Eclipse中的Maven插件) 这步就不多说了,网上一搜一大把,要说明的只有一点,第一次配好Maven插件,一定要更新一次远程库的索引,这样添加依赖的时候就不会出现搜不到那个j

Eclipse中Maven WEB工程tomcat调试

http://blog.csdn.net/clj198606061111/article/details/20221133 ********************************************** 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近没事了玩一下maven,使用maven管理工程中的依赖包非常的方便.建立maven web工程的时候开始不知道怎么用tomcat来调试,总是使用mave的tomcat插件发布了后来调试,觉得非常的麻烦,网上找了点材料,看看m

《格蠹汇编》调试笔记

以前也就是把Windbg作为一个调试所写驱动的调试器.只进行源码级的调试,运用的比较浅显. 最近研读张银奎老师的<软件调试>获益良多,刚好与之配套的<格蠹汇编>提供了老师大量的调试经验以及实验环境.不拿来好好实践一番简直浪费. 0X01调试笔记之侦查广告插件 俗话说:工欲善其事,必先利其器.对于调试领域来说,更是如此.我们不但要在自己的计算机中安装有WinDbg,还应当使用JIT调试的方法.因为对于Windows系统中的应用程序的崩溃问题,JIT调试是非常有效的办法,而且JIT调试

USB wifi调试笔记

本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中WiFi选项,将其置为on(打开),但最终结果是自动变成off(关闭).正在打开Wi-Fi.正在扫描等一系列不能正常打开WiFi的提示. 2.问题分析流程 WiFi打不开从硬件和软件两方面进行定位,一般是先硬件,然后软件.总体分析流程如图: 3.确认硬件可以识别 8192CU WiFi模块是基于usb接

SIM900A基站定位调试笔记 -转

第1步:ATE1 握手并设置回显 第2步:AT+CGMR 查看SIM900的版本信号 第3步:AT+CSQ 查看信号质量 第4步:AT+CREG? 查看GSM是否注册成功 第5步:AT+CGREG? 查看GPRS是否注册成功 第6步:AT+CGATT? 查看GPRS附着状态 第7步:AT+SAPBR=3,1,"CONTYPE","GPRS" 设置网络参数 第8步:AT+SAPBR=3,1,"APN","CMWAP"  //设置

tomcat调试之固定步骤自动化

前端开发,使用tomcat调试,大致需要进行如下几个步骤.其中,第一步,进入项目所在目录敲sbt命令来打包,第二步,拷贝lib文件夹,第四步重启tomcat,反反复复已经让我不胜其烦,那么做个简单的bat脚本使其自动化吧. 针对本人d盘中的WebApp项目,bat脚本内容如下: d: cd D:\Dev\WebApp sbt clean package xcopy /y/s D:\Dev\WebApp\target\webapp\WEB-INF D:\Dev\WebApp\src\main\we

JavaScript特效(调试笔记)

JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: 1 function getTime() { 2 var today = new Date(); //返回当日的日期和时间. 3 var year = today.getFullYear(); //获得当前的年份 4 var month = today.getMonth() + 1; //获得当前的月份 5 var day = today.getDate(); //获得当前的日期 6

Tomcat问题笔记

1. Tomcat服务器只能同步WebContent目录到webapps下面,如果WebContent里面的.html文件引用了与WebContent文件夹同级目录下的一个.js文件,Tomcat服务器并不会同步这个.js文件到webapps下面,在Eclipse中run on server是能够正确引用这个js文件的,但是直接到Tomcat的webapps下面的工程文件夹下面打开.html文件,是无法正确引用到.js文件的,这说明.js并未发生任何拷贝,那么为什么在Eclipse中直接在服务器

OMAPL138调试笔记

title: Linux 嵌入式使用 tags: 新建,模板,小书匠 grammar_cjkRuby: true Copyright (C) @2018 Widic Filename: File-function: Cre_ID: @ Widic 2018-1-23 Mod_ID: 三 学习过程 20170617 uart2 作为调试串口 band rate 115200 串口调试终端采用ZOC 3.开发板启动开官如下: SD卡挂载boot分区挂载在/media/mmcblk0p1 u盘挂载的方