背景
廢話不多說,在用idea生成的web應用中,通過tomcat啟動之后,無法訪問@WebServlet定義的Servlet,報404錯誤
問題定位過程
由於項目是個demo,直接通過idea生成,理論上直接就可以用了。然后百度了一下,回答都是以下兩種原因
- web.xml協議版本太低,要3.0以上才支持
- metadata-complete要設置為false
我檢查了我的項目,版本是4.0,metadata-complete沒有設置,但我看定義說明,默認就不需要設置
后面還是按照別人的回答去設置了,重新啟動,一樣的效果
看來是別人的問題點跟我的不一樣,需要重新定位。
我不再用@WebServlet注解,直接在web.xml里面配置servlet看下是不是注解有問題
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>zhugr.demo.simpleWeb.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
重啟,重新訪問,報錯,不過還好,這是另外一個錯了
這是說類沒找到,這種問題一般是版本沖突導致的,我找了本地tomcat的servlet看,原來是tomcat的版本和原本項目的版本沖突了。。。
我的tomcat版本是10.0.8(通過homebrew安裝),這么高的版本用的jdk不再是javax的命名空間,而是jakarta,個中緣由可以看下這個貼:
https://fangshixiang.blog.csdn.net/article/details/118403779
至此問題終於找到了,把maven的servlet引入改為下面GAV即可(類中接口的引入也要變更):
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>