問題背景
環境參數:
學習maven依賴範圍,跟着視頻演示沒有設置servlet-api的依賴範圍為provided時,訪問服務器報錯。
報錯信息
報錯內容: 報錯信息: HTTP Status 500 - Class.xxx.xxx.xxx. is not a Servlet [視頻演示]
報錯截圖:
問題分析
單獨添加servlet-api.jar原因:
在案例中,添加了tomcat7插件plugin,提供了tomcat容器環境,tomcat中提供servlet-api.jar,但是隻有當運行tomcat時才會使用到這個servlet,所以避免在編譯階段因為沒有servlet而報錯,需要單獨提供一個servlet依賴。
設置單獨的servlet依賴的<scope>為provided原因:
如果不設置為provided,則運行打包階段單獨的servlet會和tomcat容器中的servlet打包在同一個文件夾中造成衝突而報錯。單獨的servlet僅希望在編譯階段中有效,而運行打包階段不需要將這個servlet打包。
問題解決
一般情況下,單獨添加的servlet-api依賴座標需要添加<scope>為provided
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
maven依賴範圍表格
| 依賴範圍 | 對編譯階段有效 | 對測試階段有效 | 對運行時有效 | 例子 |
|---|---|---|---|---|
| compile | Y | Y | Y | spring-core |
| test | Y | Junit | ||
| provided | Y | Y | servlet-api | |
| runtime | Y | Y | JDBC驅動 | |
| system | Y | Y | 本地Maven參控股之外的類庫【不需要了解】 |
相關參考
【視頻】依賴範圍詳解: https://www.bilibili.com/vide...