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 包路径 |