Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

当我们使用Maven项目编写传统web时,需要使用Servlet,这时我们就需要在pom.xml文件中导入所需的jar包,

此时我们导入了servlet-apijsp-api并选择了版本

Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

编写完代码后,在左侧maven工具栏的Lifecycle中执行maven生命周期的各个命令,下面Plugins可以看到每个命令所对应的插件

Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

我们需要运行web项目,执行mvn tomcat:run来运行maven的tomcat,但我们发现右侧maven工具栏没有这个命令,

此时我们需要点击这个带m的按钮手动输入要执行的命令,运行

Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

可以运行成功,访问地址后发现报错了,提示MyServlet不能被识别为一个Servlet,可明明就是一个Servlet。

Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

maven有一键构建功能,当我们使用mvn tomcat:run 命令时,不再使用本地的tomcat,而是使用maven集成的tomcat插件对项目进行构建,

而这个tomcat插件中也有tomcat运行所需的jar包,我们可以看看本地tomcat运行所需的jar包中都有什么。

Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

在tomcat的lib中我们发现也有jsp-api.jarservlet-api.jar两个jar包,当我们运行此项目的时候,项目中就出现了两套一摸一样的包,我们自己导入的包和

tomcat中,这两套包名称一模一样是相冲突的,所以运行项目时只能保留一套。

所以需要在maven的pom.xml文件中对导入的包设置作用域。

Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用

在version下增加scope标签,指明作用域范围,

compile :为默认的依赖有效范围。如果在定义依赖关系的时候,没有明确指定依赖有效范围的话,则默认采用该依赖有效范围。此种依赖,在编译、运行、测试时均有效。

provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api,运行项目时,容器已经提供,就不需要Maven重复地引入一遍了。

runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现,项目代码编译只需要JDK提供的JDBC接口,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动。

test :只在测试时有效,例如:JUnit。

system :在编译、测试时有效,但是在运行时无效。和provided的区别是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量。

再次运行项目,访问成功