maven导入jar包时冲突的解决四种方式问题The server encountered an internal error () that prevented it from fulfilling
问题:
The server encountered an internal error () that prevented it from fulfilling this request.
运行tomcat:run 运行项目成功了,访问url失败
报错:不能将一个Myservlet识别为一个servlet
maven有一键构建的功能(不再使用本地安装的tomcat,而是使用maven自身集成的tomcat插件进行构建项目)
问题分析: 设置作用域
本地的tomcat的lib目录中有jsp:api,servlet:api的jar包,这两个包已经在依赖中导入了这两个jar包,则产生了jar包冲突
但是如果不在依赖中导入jar包,则会出现代码报错;如果导入了jar包,则出现了jar包冲突,编译没有错,但是输入url出现了运行时异常
依赖管理的jar包设置作用范围,只在编译时起作用,在运行时采用tomcat插件中jar包
文档链接:
知识点:
maven工程要导入jar包的坐标,就必须考虑解决jar包冲突
当导入坐标后,可以通过下图所示查看当前项目/jar包下中的传递依赖,传递依赖的关系图:
spring-context和spring-bean都导入了spring-core的jar包,但是spring-context和spring-bean的版本不一样,导致spring-core的版本不一致。
maven工程要导入jar包的坐标,就必须考虑解决jar包冲突
-
解决jar包冲突的方式一:
第一声明优先原则,哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。
先声明的jar包坐标下的依赖包,可以优先进入项目中。
明显,上图先进入项目中的jar包是靠上声明的。
maven导入jar包中的一些概念:
直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包
传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去
-
解决jar包冲突的方式二:
路径近者优先原则。直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖包。
进入项目的jar包会是下面声明的直接依赖
-
解决jar包冲突的方式三【推荐使用】:
直接排除法
当我们要排除某个jar包下依赖包,在配置exclusions标签的时候,内部可以不写版本号,排除不需要的jar包
因为此时依赖包使用的版本和默认版本jar包一样
-
解决jar包冲突的方式四:
使用properties控制jar包版本,在version标签使用${spring.version} {括号里写的是你properties中标签自己取的名字},然后在写入坐标依赖(一定要写,前面两步仅仅是版本锁定,没有导入依赖)