Maven导入Servlet-api包导致无法运行报500的问题

以下解决方式适用于跟我类似的配置环境,构建servlet程序后,启动Tomcat页面报“类com.tioxy.servlet.MyServlet不是Servlet,MyServlet cannot be cast to class jakarta.servlet.Servlet”或者“实例化Servlet类异常”的500错误的问题。

我的本机配置环境:

1.IDEA 2020.1,Tomcat 10.0.0M5,Maven 3.6.3,导入的javax.servlet-api 4.0.1

最近在学习Java Servlet,并用Maven构建的模板,导入servlet-api依赖包,写了一个简单的Servlet程序,就是很简单的重写doGet、doPost,向页面输出一段“hello,servlet”文本。



然后配置Tomcat服务器,跑起来控制台输出也正常,一切看起来似乎没什么问题,心想servlet构建起来也不过如此嘛!

当我输入/hello,准备见证奇迹时......

这......,不是一个servlet类???,回去跟了跟代码,确定没写错啊,要不百度吧,看看网上怎么说。

哦,原来是导入的Servlet-api包与tomcat冲突,tomcat自带了jar包,需要在自己导入的jar包上添加作用域。原来如此那么咱也加上,这不很简单,小意思。

重新启动,重新输入/hello,正要准备结束一切,迎接结果时

这怎么跟刚才的错误还不一样,实例化Servlet类异常,说是找不到javax/servlet/http/HttpServlet,我明明导入了jar包啊,也加了作用域了,难道我用的新版兼容性不好???

于是我想,要不不用maven依赖导包了,我自己建了一个lib目录,把servlet-api包放到里面,然后再引用自己的包。

然后再次运行,输入/hello

这怎么又回到第一个错误了,心情有点烦,这么简单的都跑不起来,开始怀疑智商......然后检查生成的target目录

这也没毛病啊,于是这样反复两小时,发现不加依赖包作用域,生成的target包lib目录下有servlet-api包,加了作用域,反而没了,于是我加了作用域,在F4模块构件时添加servlet-api包,试了几次还是不行,顿时心态炸了,这么简单的玩意都搞不定,开始怀疑人生。

我又开始想,既然tomcat自带了jar包,那我直接选用tomcat依赖不就行了。



点击应用后,发现程序爆红了

玩我呢,我这不添加依赖了吗,而且还是tomcat自带的依赖。于是我删掉,重新写了一遍类

咦?这不有HttpServlet吗?为啥刚才给我爆红,思考了三秒钟。。。不管了,先跑起来再说。

撸完了代码,重新启动,抱着最后的希望,输入/hello(说实话,在输入的过程中,我向上帝祈祷了。。。)

嚯,终于通了,留下了激动的泪水,看了看表,距离我第一次启动已经过去三个小时了,跑个程序是真不容易啊,简直是玩命啊!!!,怀疑的我差点想放弃了。

成功是成功了,但是咱要分析问题,这次为什么能成功呢?还记得上面有个小疑问,为啥导入tomcat依赖,程序报错,我自己手写了一遍,发现是能索引出来HttpServlet的这个类。

经过反复的重试,我重新导入maven依赖包,这次tomcat与maven的两个包同时存在。果真,真发现了猫腻:

这两个包的包名不一致

重新看了第一次报错500的原因,注意标注的位置,人家报的是找不到jakarta.servlet.Servlet。

于是大概明白了,Tomcat10竟然改包名了。在tomcat运行的时候,首先会加载tomcat自带的servlet-api包,因为自己导入的包名与tomcat自带的不一致,所以一致报错500,真相大白!

解决方法

看了这么长苦逼的操作,总算是解决了问题,那么同样问题的小伙伴该怎么解决呢,我提供了两种方案:

  1. 降Tomcat版本,降到9版本的。
  2. 不用降版本,不要使用maven导入的servlet-api包,在F4的项目模块中引入Tomcat依赖,操作步骤在上面有说明。

这只是我自己的解决方式,如果哪位小伙伴有更好的方式,也可以在评论区留言。

Servlet学习之Maven导入Servlet-api包与Tomcat冲突报500问题的更多相关文章

  1. maven导入外部jar包的方法

    maven的导入外部jar包的方法(前提还有外部jar包) 1.问题: 在maven添加依赖包时,添加不成功,可以选择通过外部命令导入到仓库里. 2.命令:(在Dos命令行) mvn install: ...

  2. 使用Maven导入MySQL驱动包遇到的问题

    问题描述 今天在使用Maven导入MySQL数据库驱动包依赖后,直接运行项目,出现错误. java.sql.SQLException: No suitable driver found for jdb ...

  3. servlet学习总结(一)——初识Servlet

    Servlet工作过程 当客户端向web服务器发送servlet请求时,web服务器首先检查是否已经加载并创建了servlet实例对象.如果没有会装载并创建该Servlet的一个实例对象.然后调用se ...

  4. 【JSP&Servlet学习笔记】5.Servlet进阶AIP、过滤器与监听器

    Servlet接口上,与生命周期及请求服务相关的三个方法是init().service()与destory()方法.当Web容器加载Servlet类并实例化之后,会生成ServletConfig对象并 ...

  5. 使用maven导入任意jar包

    http://mvnrepository.com/ 我这里,因为是spark1.5.2版本. 保存,maven会自动下载jar包到本地仓库.

  6. maven导入本地jar包

    <dependency> <groupId>com.qrcode</groupId> <artifactId>qrcode</artifactId ...

  7. 转!java web项目 build path 导入jar包,tomcat启动报错 找不到该类

    在eclipse集成tomcat开发java web项目时,引入的外部jar包,编译通过,但启动tomcat运行web时提示找不到jar包内的类,需要作如下配置,将jar包在部署到集成的tomcat环 ...

  8. idea中怎么去查看maven项目的依赖包是否有冲突

    1:快捷键:

  9. SpringMVC框架详细教程(四)_使用maven导入各个版本的Spring依赖包

    使用maven导入Spring依赖包 上一节讲了如何向动态Web项目添加下载的Spring依赖包,作为补充下面列出了如何使用 maven 导入Spring的依赖包,可以选择需要的导入(推荐)或者全部导 ...

随机推荐

  1. 2020年Web前端开发工程师市场怎么样?学会什么技术才能拿到高薪

    几乎整个互联网行业都缺前端工程师,不仅在刚起步的创业公司,对上市公司乃至巨头这个问题也一样存在.据统计,国外的前端开发人员和后端开发人员比例约1:1,但是在国内比例却在1:3以下, Web前端开发职位 ...

  2. CSS技术让高度自适应减少很多不必要的检测

    高度自适应第一种情况 1.高度不去设置,或者高度设置auto 内容撑开父元素的高度.2.内容撑开父元素的高度 -> 最小高度的设置 min-height3.浮动元素添加高度自适应 -> 添 ...

  3. 攻防世界-新手篇(Mise)~~~

    Mise this_is_flag 签到题flag{th1s_!s_a_d4m0_4la9} pdf 打开图片,flag值在图片底下,wps将pdf转为word格式后,将图片拉开发现flag flag ...

  4. uniapp,微信小程序中使用 MQTT

    最近在uniapp打包成微信小程序的项目中第一次用到了MQTT.使用比较简单,但是还是遇到了一些问题.在此记录一下. 官方文档:MQTT Github 官方MQTT测试工具:MQTTX.测试工具使用说 ...

  5. scala 数据结构(十):折叠、扫描、拉链(合并)、迭代器

    1 折叠 fold函数将上一步返回的值作为函数的第一个参数继续传递参与运算,直到list中的所有元素被遍历. 1)可以把reduceLeft看做简化版的foldLeft. 如何理解: def redu ...

  6. Scala 面向对象(十二):嵌套类

    在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构.如在类中可以再定义一个类,这样的类是嵌套类,其他语法结构也是一样. 嵌套类类似于Java中的内部类. Scala嵌套类的使用1 请编写程序, ...

  7. AcWing 93. 递归实现组合型枚举

    AcWing 93. 递归实现组合型枚举 原题链接 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的 ...

  8. 重装win7时遇到点小问题

         最近装系统的时候有个头疼的事,事情的起因是这样的,我在工作的时候用的win7,破解的时候各种工具都破解不了,说是有未分配的盘符.并且,当时装的是没更新的win7,工作上要用到ie11只能在w ...

  9. Jmeter(十七) - 从入门到精通 - JMeter后置处理器 -上篇(详解教程)

    1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...

  10. MAC地址和交换机

    数据链路层主要关注三个问题: 这个包是发给谁的?谁应该接收? 大家都在发,会不会产生混乱?有没有谁先发.谁后发的规则? 如果发送的时候出现了错误,怎么办? 数据链路层也称为MAC(Medium Acc ...