1. 問題描述
控制台說:無法將 com.zpx.servlet.MyServlet 識別為 javax.servlet.Servlet
2. 問題原因
Maven的一個核心功能就是一鍵構建,所以Maven將不再使用本地安裝的Tomcat,而是使用Maven自身集成的Tomcat插件對項目進行構建。手動導入的 jar 包和本地安裝的Tomcat中的 jar 包名字完全一樣,卻又是兩個包,造成了 jar 包沖突異常。
3. 解決方法
Maven為 jar 包坐標提供了 <scope> 標簽,指明了 jar 包的作用域,限制了 jar 包的使用范圍,解決了 jar 包沖突。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
4. 要點補充
Maven的 <scope> 標簽有五個屬性,他們的作用域分別是:
compile:默認屬性,對於 編譯、測試、運行 三個狀態都有效
test:僅對 測試 狀態有效(例如:junit)
provided:僅對 編譯和測試 狀態有效(例如:servlet-api、jsp-api)
runtime:僅對 測試和運行 裝填有效(例如:JDBC)
system:僅對 編譯和測試 狀態有效,但是需要顯式提供本地 jar 包路徑